我编写了以下代码来处理多个文件中的每一行,并在行尾添加文件名:
for i in $(cat all_output_file.txt);do cat $i|sed 's/:/ /g'|sed 's/-/ /g'| sed 's/,cn=/ /g'| awk 'BEGIN{OFS="\t"}{print $1,$2,$3,$6,FILENAME}'>>input_file.txt;done
然而,上面的代码打印" - "在每行的末尾而不是文件名,如何在每个处理行的末尾打印文件名?
答案 0 :(得分:1)
这是因为awk正在从stdin
读取而不是从文件中读取。
说过你可以在awk
本身做到这一切:
while IFS= read -r line; do
awk 'BEGIN{OFS="\t"}{gsub(/[:-]|,cn/, " "); print $1,$2,$3,$6, FILENAME}' "$line"
done < all_output_file.txt >>input_file.txt
gsub
相当于3 sed
个命令。
Also check this BASH FAQ on reading a file line by line
如下面@123所述,您甚至可以避免使用for
循环并使用:
awk -v OFS='\t' '{gsub(/[:-]|,cn/, " ");
print $1,$2,$3,$6, FILENAME}' $(<all_output_file.txt) >>input_file.txt
在BASH中$(<all_output_file.txt)
读取输入文件的内容。