我有一些带有多个文件的目录,扩展名为.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
答案 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的特性并分别处理每个文件地址。仅在文件的第一行显示当前文件名。替换并打印所需字符串之间的值。