具有唯一校验和的行

具有唯一校验和的行

我有一个文件 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 开头^并使用grepnot ,这样fgrep它只匹配行的开头,即键,但如果它是类似 md5sum 的东西,那么错误匹配的机会就会很小。 (而且我很懒:-))

相关内容