цикл bash для выполнения команды только в последнем файле - PullRequest
0 голосов
/ 13 марта 2019

Я использовал split, чтобы разделить CSV-файл со строками + 6 м и преобразовать его в TSV с помощью sed. Все работало замечательно, мне нужно только избавиться от последней строки последнего файла (файлы имеют алфавитно-нисходящие расширения благодаря split).

Вот моя файловая структура.

├── persons-with-significant-control-snapshot-2019-03-13.txt
├── psc_aa
├── psc_aa.csv
├── psc_aa.csv.tsv
├── psc_ab
├── psc_ab.csv
├── psc_ab.csv.tsv
├── psc_ac
├── psc_ac.csv
├── psc_ac.csv.tsv
├── psc_ad
├── psc_ad.csv
├── psc_ad.csv.tsv
├── psc_ae
├── psc_ae.csv
├── psc_ae.csv.tsv
├── psc_af
├── psc_af.csv
├── psc_af.csv.tsv
├── psc_ag
├── psc_ag.csv
└── psc_ag.csv.tsv

Я знаю, что последняя строка последнего файла систематически прерывается после преобразования в tsv - теперь возникает проблема: я знаю, как удалить последнюю строку , когда я знаю имя файла, но когда я не т :

sed -i '$d' psc_ag.csv.tsv

Но в идеале этот мини-конвейер будет работать автоматически, поэтому в зависимости от имен программы split этот sed может измениться.

В псевдокоде мне нужно что-то вроде этого:

for file in psc_*.csv.tsv
if iterating on last_file
do sed -i '$d' last_file

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

попробуйте это:

find [PATH] -printf "%T@ %p\n" | sort -n | cut -d " " -f2 | tail -n 1
2 голосов
/ 13 марта 2019

Вы можете сделать это довольно просто с массивами bash:

#use globbing to get a list of files into an array (note
#  globs return in alpha-numeric order by default  
files=( psc_*.csv.tsv )

last_file="${files[-1]}"

#loop through everything except last entry:
for file in "${files[@]::${#files[@]}-1}" do
    ...
done

#handle last entry:
sed -i '$d' $last_file
0 голосов
/ 17 марта 2019

Использование GNU sed:

sed -i '$d' psc_*.csv.tsv

Примечание: этот метод неэффективен, так как sed читает каждый файл.

...