使用 AWK 命令转换为同名的 csv 文件

使用 AWK 命令转换为同名的 csv 文件

我使用此命令来处理文本文件,我的目标是将输出保存为 CSV 格式。

awk -f test.awk /FILES/detail-1019:01 > detail-1019_01.csv

但问题是,我有很多文件,我不想单独对每个文件运行处理命令。那么我应该如何运行我的处理命令并将每个文件一次性保存为 CSV 格式?

输入文件名:

detail-1019:17
detail-1019:18
detail-1019:19
detail-1019:20
detail-1019:21
detail-1019:22

我想要的输出文件名:

detail-1019_17.csv
detail-1019_18.csv
detail-1019_19.csv
detail-1019_20.csv
detail-1019_21.csv
detail-1019_22.csv

答案1

你可以做

for f in /FILES/detail*; do awk -f test.awk $f > $(echo $f | sed -e 's/^\/FILES\///' -e 's/:/_/').csv; done

答案2

有两种主要方法可以解决这个问题。

  1. 使用 shell 循环,在其中调用awk代码并将输出重定向到从当前输入文件派生的名称,或者

  2. 致电awk一次全部文件作为参数,并将输出输出到脚本中适当命名的文件中awk。请注意,只有当您的文件少于数千个时,这才可能实现。

我不会触及这两个中的第二个,因为我们看不到您的awk代码,因此无法建议其中需要更改的内容(NR例如,如果您正在使用 ,这可能必须更改为 using FNR,并且可能还需要其他更改)。


使用 shell 循环:

for pathname in /FILES/detail-*:??; do
    name=${pathname##*/}
    awk -f script.awk "$pathname" >"${name%:??}_${name##*:}.csv"
done

这里使用的三个参数替换:

  1. ${pathname##*/},从路径名中删除目录路径,只留下字符串的文件名部分。
  2. ${name%:??},从 中的文件名中删除尾随:字符及其后的两个字符name。然后,该位与下划线连接并与...
  3. ${name##*:}.csv,删除:文件名末尾之前的所有内容,并.csv在末尾添加文件名后缀。

第二个和第三个替换用于替换:文件名末尾的 来_创建输出文件名。

相关内容