【问题标题】:writing a filename after each processed line在每个处理的行之后写一个文件名
【发布时间】:2016-02-18 10:13:50
【问题描述】:

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

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读取的
  • 是的,我想通了,后来,我将处理后的行存储在一个变量中,并尝试使用“echo”打印文件名,但它也没有成功。

标签: bash for-loop filenames


【解决方案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 中$(&lt;all_output_file.txt) 读取输入文件的内容。

【讨论】:

  • 跳过循环和多个 awk 分叉,只使用 awk 'stuff' $(&lt;file)
  • 谢谢,它成功了。现在我必须了解它是如何工作的。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2012-10-15
  • 2022-07-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多