如何将字符串与多个文件隔离,将它们放在一个输出文件中,文件名为UNIX中的标题

时间:2017-01-25 18:46:54

标签: unix awk sed grep

我有一些带有多个文件的目录,扩展名为.failed 此文件具有以下格式:

file1.failed:

FHEAD|4525|20170109000000|20170125024831
THEAD|150001021|20170109121206||
TDETL|4000785067||1|EA|||RETURN|||N
TTAIL|1
THEAD|150001022|20170109012801||
TDETL|4000804525||1|EA|||RETURN|||N
TTAIL|1
FTAIL|6

我需要提取THEAD |之间的所有文字和| 2到输出文件。 我尝试以下操作,只有当目录中只有一个文件时才有效。

sed -n 's:.*THEAD|\(.*\)|2.*:\1:p' <*.failed >transactions.log

输出为:

transactions.log:

150001021
150001022

现在我怎样才能为多个文件做同样的事情? 还可以在输出文件中添加文件名吗?

预期产出:

file1.failed
150001021
150001022
file2.failed
150001023
150001024
150001025

2 个答案:

答案 0 :(得分:1)

在awk中:

$ awk -F\| 'FNR==1{print FILENAME} $1=="THEAD"{print $2}' foo foo
foo
150001021
150001022
foo
150001021
150001022

在每个文件的第一条记录上打印出文件名,然后在以THEAD开头的记录上打印第二个字段。将foo替换为所有必需的文件。

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -sn '1F;s/^THEAD|\([^|]*\)|.*/\1/p' file1 file2 file3 ...

使用选项-n-s来调用类似grep的特性并分别处理每个文件地址。仅在文件的第一行显示当前文件名。替换并打印所需字符串之间的值。