该文件包含多个字段:
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和结果与单独的文件结合起来以一种天真的方式实现它,但我想学习如何在一行中完成它。
感谢您的任何评论。
答案 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
会变得很昂贵。