使用 awk 打印匹配键的列范围
Using awk to print range of columns for matching keys
这似乎有一个简单的解决方案,但我被卡住了。我想在一个密钥文件中查找主文件的第二列,对于任何匹配的密钥,只打印前两列,但其余的是整个记录。我有一个工作脚本,但它会打印匹配键的整行。你能帮忙吗?
awk 'FNR == NR {key[]; next} in key {print ,}' 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 'FNR == NR {key[]; next} in key {print ,;next} 1' keyfile mainfile
最后一个 1
表示一个空块,其默认行为是打印整行。
并与前面块中的 next
结合,充当一种 if else
开关。
您可以使用这个 awk
:
awk 'FNR == NR {key[]; next} {print ( in key ? OFS : [=10=])}' keyfile mainfile | column -t > outfile
cat outfile
PSHELL 10
PSHELL 15 136514 0.7
PSHELL 20 136513 2.0
PSHELL 30
这里:
- 当我们在
key
数组中找到 </code> 时使用三元运算打印 <code> OFS
否则我们打印 [=15=]
.
- 用于
column -t
表格输出
这是执行相同操作的另一种方法。假设您不关心输出行的顺序,那么以下内容也可能对您有所帮助。
awk '
FNR==NR{
arr1[]= OFS
arr2[]=[=10=]
next
}
( in arr1){
print arr1[]
arr3[]
}
END{
for(key in arr2){
if(!(key in arr3)){
print arr2[key]
}
}
}
' mainfile keyfile
这似乎有一个简单的解决方案,但我被卡住了。我想在一个密钥文件中查找主文件的第二列,对于任何匹配的密钥,只打印前两列,但其余的是整个记录。我有一个工作脚本,但它会打印匹配键的整行。你能帮忙吗?
awk 'FNR == NR {key[]; next} in key {print ,}' 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 'FNR == NR {key[]; next} in key {print ,;next} 1' keyfile mainfile
最后一个 1
表示一个空块,其默认行为是打印整行。
并与前面块中的 next
结合,充当一种 if else
开关。
您可以使用这个 awk
:
awk 'FNR == NR {key[]; next} {print ( in key ? OFS : [=10=])}' keyfile mainfile | column -t > outfile
cat outfile
PSHELL 10
PSHELL 15 136514 0.7
PSHELL 20 136513 2.0
PSHELL 30
这里:
- 当我们在
key
数组中找到</code> 时使用三元运算打印 <code> OFS
否则我们打印[=15=]
. - 用于
column -t
表格输出
这是执行相同操作的另一种方法。假设您不关心输出行的顺序,那么以下内容也可能对您有所帮助。
awk '
FNR==NR{
arr1[]= OFS
arr2[]=[=10=]
next
}
( in arr1){
print arr1[]
arr3[]
}
END{
for(key in arr2){
if(!(key in arr3)){
print arr2[key]
}
}
}
' mainfile keyfile