[英]Using awk to print range of columns for matching keys
这似乎有一个简单的解决方案,但我被卡住了。 我想在密钥文件中查找主文件的第二列,对于任何匹配的密钥,只打印前两列,但打印 rest 的整个记录。我有一个工作脚本,但打印整行对于匹配的键。 你能帮忙吗?
awk 'FNR == NR {key[$1]; next} $2 in key {print $1,$2}' keyfile mainfile > outfile
主文件:
PSHELL 10 136514 0.7
PSHELL 15 136514 0.7
PSHELL 20 136513 2.0
PSHELL 30 13571 1.7
密钥文件:
10
30
输出文件:
PSHELL 10
PSHELL 15 136514 0.7
PSHELL 20 136513 2.0
PSHELL 30
您可以使用此awk
:
awk 'FNR == NR {key[$1]; next} {print ($2 in key ? $1 OFS $2 : $0)}' keyfile mainfile | column -t > outfile
cat outfile
PSHELL 10
PSHELL 15 136514 0.7
PSHELL 20 136513 2.0
PSHELL 30
这里:
key
数组中找到$2
2 时,使用三元运算打印$1 OFS $2
否则我们打印$0
。column -t
尝试这个:
awk 'FNR == NR {key[$1]; next} $2 in key {print $1,$2;next} 1' keyfile mainfile
最后一个1
表示一个空块,其默认行为是打印整行。
并与前面块中的next
结合,充当一种if else
开关。
这是执行相同操作的另一种方法。 假设您不关心 output 行的顺序,那么以下内容也可能对您有所帮助。
awk '
FNR==NR{
arr1[$2]=$1 OFS $2
arr2[$2]=$0
next
}
($1 in arr1){
print arr1[$1]
arr3[$1]
}
END{
for(key in arr2){
if(!(key in arr3)){
print arr2[key]
}
}
}
' mainfile keyfile
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.