我有一个文件 A,其中包含长度为 n 的行。我有一个程序,对于 A 中的每一行都可以输出长度为 n 的行及其键。该程序可以将 A 中各行的键序列写入文件 B 中,也可以将它们写入 A 中每一行的 stdout。
我需要获取 A 的所有行,以便各个键不会重复。完成此操作最有效的方法是什么?我看到有一个 -k 选项,但它似乎并没有完全达到我想要的效果。
编辑。对评论进行澄清。
假设 A 包含以下行
foo
bar
baz
第二个程序计算这些行的键输出
xxx
yyy
xxx
其中第一行是 foo 的输出,第二行是 bar 的输出,第三行是 baz 的输出。
那么正确的输出之一是
foo
bar
答案1
正如您所指定的(但请考虑 wurtel 对您的问题的评论):
generate_keys A > B # adjust this call however that program is defined to work
awk '
NR==FNR { a[NR]=$1 ; next }
!b[$1]++ { print a[FNR] }
' A B
答案2
没有一些示例数据就无法测试,但是像这样:
paste <(generate-keys "$filename") "$filename" |
awk '! seen[$1]++ {print $2}'
答案3
$ getkeys A > B
$ sort B | uniq -c | awk '{if($1 == 1) print $2}' > C
$ paste B A | fgrep -f C | cut -f2-
解释:
首先生成每行的密钥。
然后统计每个key出现的次数,并将出现过一次的key保存在文件C中。
然后使用 将paste
这些行与唯一键列表匹配fgrep
,然后使用 仅选择该行(省略键)cut
。
最好让 C 中的字符串以 a 开头^
并使用grep
not ,这样fgrep
它只匹配行的开头,即键,但如果它是类似 md5sum 的东西,那么错误匹配的机会就会很小。 (而且我很懒:-))