【发布时间】:2017-03-30 19:38:39
【问题描述】:
我有一个大文件,第一列中包含 ID 号,随后的列中包含其他唯一信息。每个 ID 号在文件中出现多次:
000112 3489 A-8 40984
000112 4743 A-7 94587
000112 5894 A-1 45795
000177 8347 A-2 54575
000177 5843 B-5 94342
000177 5684 A-4 76544
000177 6586 C-2 65834
000226 5679 C-2 85795
000226 5456 C-1 45876
000226 9899 A-2 56834
我想输出一个文件,其中仅包含每个 ID 号的前两次出现的行:
000112 3489 A-8 40984
000112 4743 A-7 94587
000177 8347 A-2 54575
000177 5843 B-5 94342
000226 5679 C-2 85795
000226 5456 C-1 45876
请注意,此数据仅代表输入文件的一小部分,因此需要输入特定字符串(ID 号)的命令不是我想要的。谢谢!
【问题讨论】:
-
用什么语言?
-
在示例输入(和输出)中,具有给定 ID 的所有行都是连续的。此外,对 ID 进行排序。您应该说明您是否可以在实际输入中依赖这些因素(以及在实际输出中是否需要它们)。
-
使用 linux 命令(例如 grep/uniq)和/或 awk 命令。让我们假设真实的输入和输出文件都没有以任何方式排序。所需的输出是每个唯一 ID 号中只有两个的行信息。因此,(例如)参考上面的输入,000112 3489 A-8 40984 和 000112 5894 A-1 45795 与上面输出中的 000112 信息一样有用。我想我可以分 4 个步骤完成任务; (1) awk '!seen[$1]++' input.file > output1 (2) grep -v -F -f output1 input.file > output2 (3) awk '!seen[$1]++' output2 > output3 (4) 猫输出1 输出3 |排序 -k 1 > 期望的输出
-
像
awk '++seen[$1] < 3' input.txt这样的东西应该做你想做的......
标签: linux awk grep text-parsing