当通过管道连续执行awk时,如何保持原始字段的打印

时间:2016-02-17 18:57:05

标签: bash awk

该文件包含多个字段:

string1 string2

我会为 string2 做一些处理,产生一些结果: string2 - > result1 result2

awk '{print $2}' FILE | awk -F. '{DO SOMETHING;print result1,result2}'

现在我将每行输出为:

string1 result1 result2

请注意,str1和str2都包含点(。)。在string2中,点用作分隔符来进行计算,并且应忽略string1的点。所以我必须首先使用提取string2,然后将其传递给下一个awk。如何将string1保存在变量中,然后将其传递给下一个awk并打印出来?

我知道我可以通过将结果输出到第二个文件然后将string1和结果与单独的文件结合起来以一种天真的方式实现它,但我想学习如何在一行中完成它。

感谢您的任何评论。

3 个答案:

答案 0 :(得分:1)

您根本不需要第一个awk脚本。在使用分隔符拆分后,在第二个字段上进行处理,并将第一个字段与结果一起输出。由于您没有提供真正的测试输入/输出,因此这是一个模拟。

$ echo "a.b.c d.1.2.3" 
  | awk '{split($2,s,"."); 
          result1=s[1]; 
          result2=s[2]"/"s[3]; 
          print $1, result1, result2}'

a.b.c d 1/2

答案 1 :(得分:0)

简短的回答是第二个awk脚本只能看到第一个程序的输出,所以无法完成你想要的。

更长的答案是可以完成,但只能通过做各种讨厌的技巧,例如将结果放入单独的文件中,或者通过为每一行执行新的awk,以及传递作为-D变量的结果,这可以通过调用'系统来实现(" / bin / echo $ 2 | awk -D" $ 1" {DO_SOMETHING; ...}&#39但是,这不是一个很好的解决方案。

要做这样的事情,您可能希望升级到Perl或Python,因为这些可以为您提供更丰富的脚本环境。

答案 2 :(得分:0)

首先确定您的DO SOMETHING是什么。当你想要在awk中完成某些事情时,请使用awk!当您需要使用一些特殊的脚本/程序处理string2时,您可以使用while-construction:

while read -r string1 string2; do
   results="$(my_abacadabra ${string2})"
   result1=${result#.*}
   result2=${result%%*.}
   printf "%s %s %s\n" "${string1}" "${result1}" "${string2}"
done < FILE

对于大型输入文件,请先再看一下awk。你想避免使用while循环,为每一行调用my_abacadabra会变得很昂贵。