Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从多个文件中隔离字符串在UNIX中将它们放在一个文件名为头的输出文件中_Unix_Awk_Sed_Grep - Fatal编程技术网

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

如何从多个文件中隔离字符串在UNIX中将它们放在一个文件名为头的输出文件中,unix,awk,sed,grep,Unix,Awk,Sed,Grep,我有一个包含多个扩展名为的文件的目录。失败 这些文件的格式如下: file1.失败: 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 150

我有一个包含多个扩展名为的文件的目录。失败 这些文件的格式如下:

file1.失败:

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
150001021
150001022
file1.failed
150001021
150001022
file2.failed
150001023
150001024
150001025
我需要将ad |和| 2之间的所有文本提取到输出文件中。 我正在尝试下面的方法,只有当我的目录中只有一个文件时,它才会起作用

sed -n 's:.*THEAD|\(.*\)|2.*:\1:p' <*.failed >transactions.log
现在,除了多个文件,我如何做相同的操作? 也可以在输出文件中添加文件名

预期输出:

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
150001021
150001022
file1.failed
150001021
150001022
file2.failed
150001023
150001024
150001025
在awk中:

$ awk -F\| 'FNR==1{print FILENAME} $1=="THEAD"{print $2}' foo foo
foo
150001021
150001022
foo
150001021
150001022
在每个文件的第一条记录上,它打印出文件名,然后在以
THEAD
开头的记录上打印第二个字段。用所有必需的文件替换
foo

这可能适合您(GNU-sed):


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

非常感谢这帮助我完成了关于对多个文件执行此操作的第一个步骤。但它仍然不会在输出中打印文件名。我只得到ID,没有文件名删除重定向操作符
问题是我需要所有文件都以*结尾。失败的一天,它们可以是2个,另一天,它们可以是10个甚至50个不同的填充。我想我的规格不是最详细的。。。对不起。我所做的是:
awk-F\|'FNR==1{print FILENAME}$1==THEAD{print$2}*。失败了
awk-F\|'FNR==1{print FILENAME}$1==THEAD{print$2}*。失败了
它没有像我希望的那样工作。
awk*使用三种不同的AWK,它们都可以使用。如果它对您不起作用,请尝试其他方法,例如围绕awk的shell
循环:
for i in*;不要重复$i;awk-F\|'$1==“THEAD”{print$2}'$i;完成