bash循环仅对最后一个文件执行命令

时间:2019-03-13 18:31:27

标签: linux bash file for-loop sed

我已经使用split来分割一个+ 6m行的csv文件,并使用sed将其转换为tsv。一切工作都非常好,我只需要删除最后一个文件的最后一行(由于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之后会被系统打断-现在是问题所在:当我知道文件名时,我知道如何消除最后一行,但是当我不知道时, t?

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 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:2)

尝试一下:

find [PATH] -printf "%T@ %p\n" | sort -n | cut -d " " -f2 | tail -n 1

答案 2 :(得分:0)

使用 GNU sed

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

注意:此方法效率低下,因为它会使sed读取每个文件。