我使用此命令来处理文本文件,我的目标是将输出保存为 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
有两种主要方法可以解决这个问题。
使用 shell 循环,在其中调用
awk
代码并将输出重定向到从当前输入文件派生的名称,或者致电
awk
一次全部文件作为参数,并将输出输出到脚本中适当命名的文件中awk
。请注意,只有当您的文件少于数千个时,这才可能实现。
我不会触及这两个中的第二个,因为我们看不到您的awk
代码,因此无法建议其中需要更改的内容(NR
例如,如果您正在使用 ,这可能必须更改为 using FNR
,并且可能还需要其他更改)。
使用 shell 循环:
for pathname in /FILES/detail-*:??; do
name=${pathname##*/}
awk -f script.awk "$pathname" >"${name%:??}_${name##*:}.csv"
done
这里使用的三个参数替换:
${pathname##*/}
,从路径名中删除目录路径,只留下字符串的文件名部分。${name%:??}
,从 中的文件名中删除尾随:
字符及其后的两个字符name
。然后,该位与下划线连接并与...${name##*:}.csv
,删除:
文件名末尾之前的所有内容,并.csv
在末尾添加文件名后缀。
第二个和第三个替换用于替换:
文件名末尾的 来_
创建输出文件名。