Bash 在处理的每一行之后写入文件名
我编写了以下代码来处理多个文件中的每一行,并在行尾添加文件名:Bash 在处理的每一行之后写入文件名,bash,for-loop,filenames,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 但是,上面的代码在每行末尾打印“-”而不是文件名,如何在每行处理后的末尾打印文件名 这是因为a
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
但是,上面的代码在每行末尾打印“-”而不是文件名,如何在每行处理后的末尾打印文件名 这是因为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
在BASH
$(这是因为awk
正在读取stdin
是的,我找到了答案,后来,我将处理过的行存储在一个变量中,并尝试使用“echo”打印文件名,但它也不起作用。跳过循环和多个awk分叉,只使用awk'stuff'$(谢谢,它起作用了。现在我必须了解它是如何起作用的。再次感谢!
awk -v OFS='\t' '{gsub(/[:-]|,cn/, " ");
print $1,$2,$3,$6, FILENAME}' $(<all_output_file.txt) >>input_file.txt