我已经使用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
答案 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
读取每个文件。