【问题标题】:How to output only the first n lines based on occurrences of a column string如何根据列字符串的出现仅输出前 n 行
【发布时间】: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


【解决方案1】:
awk 'a[$1]++ < 2' input-file

应该可以解决问题。只需读取文件并递增由第一列中的值索引的数组。如果该值小于 2,则打印该行。当您第三次看到相同的 id 时,数组中的索引将为 2,并且该行的输出将被抑制。

【讨论】:

    【解决方案2】:

    这并不漂亮,但它产生了所需的输出:

    第 1 步:

    awk '!seen[$1]++' input.file > output1 
    

    第 2 步:

    grep -v -F -f output1 input.file | awk '!seen[$1]++' > output2
    

    第 3 步:

    cat output1 output2 | sort -k 1 > desired.output
    

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 2011-07-31
      • 2019-02-18
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 2019-09-24
      • 2013-05-09
      相关资源
      最近更新 更多