我正在寻找一种对列表进行排序并打印所有行的方法,其第一列仅出现一次-即,仅在第一列上匹配。例如,我有一个文件,其中第一列是路径,第二列包含“类型”
/path/foo/1 footsy
/path/foo/1 barsy
/path/foo/X barsy
/path/bar/2 footsy
/path/bar/2 barsy
/path/foo/Y footsy
(该文件实际上是排序的-k1,1)
现在,我只想提取类似
/path/foo/X barsy
/path/foo/Y footsy
我正在考虑使用awk的某种方式,其中我必须存储前一行并将前一行的第一个字段与当前行中的相应字段进行比较。但是我还不知道如何完成它:(我试图适应另一个问题中找到的解决方案,但是它实际上并没有达到预期的效果
awk '{
prev=$0; path=$1; type=$2
getline
if ($1 != $path) {
print prev
}
}'
awk
通常读取输入的每一行并在其上调用脚本。您将使用的getline
情况很少,而且相差甚远。使用六行输入运行脚本时,将概述发生的情况:
正常读取第1行
设置变量
Callgetline
,它读取第2行的
比较变量正常读取第3行
设置变量
Callgetline
,它读取第4行
比较变量正常读取第5行
设置变量
Callgetline
,它读取第6行
比较变量
显然,这是行不通的。
其次,您在awk
代码中犯了一个常见错误。在中awk
,将输入中的字段引用为,将变量引用为。这与shell脚本不同,在shell脚本中,命令行参数被引用为,变量被引用为。您的测试$number
variable_name
$number
$variable_name
if ($1 != $path)
应该
if ($1 != path)
您的整体方法是有缺陷的。您无法通过一次查看两行来识别在文件中仅出现一次的字符串。我相信您可以通过一次查看三行来做到这一点(即通过将前两行保留在变量中),但是这样的事情变得复杂而混乱。计算发生次数可能更简单。这是对脚本进行的最小修改。
awk '{
if ($1 != path) {
if (count == 1) {
print prev
}
count=1
}
else count++
prev=$0; path=$1
}
END {
if (count == 1) {
print prev
}
}'
我删除了type
,因为您从未使用过。
披露:这与glenn回答的最后一部分基本相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句