【问题标题】:bash loop to execute command on last file onlybash循环仅对最后一个文件执行命令
【发布时间】:2019-08-04 13:11:58
【问题描述】:

我使用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

【问题讨论】:

  • for file in psc_*.csv.tsv; do : do something here; done; sed -i '$d' "$file"?

标签: linux bash file for-loop sed


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      使用 GNU sed:

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

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

      【讨论】:

      • 这不是要从psc_*.csv.tsv模式之后的每个文件中删除最后一行吗?
      • @TytireRecubans,不,它会只删除最后一个文件的最后一行。如果有疑问,请在bash 试试这个:sed '$d' <(printf '%s\n' {a..d}) <(seq 4)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多