在每个处理过的行后写一个文件名

时间:2016-02-18 10:13:50

标签: bash for-loop filenames

我编写了以下代码来处理多个文件中的每一行,并在行尾添加文件名:

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

然而,上面的代码打印" - "在每行的末尾而不是文件名,如何在每个处理行的末尾打印文件名?

1 个答案:

答案 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)读取输入文件的内容。