【问题标题】:Extracting the first line in group提取组中的第一行
【发布时间】:2019-06-12 06:19:04
【问题描述】:

我有一个包含目录和文件列表的大文件(由find 生成)。它的内容是这样的:

./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat

所以,我只需要每个目录的一个文件(顺序无关紧要),想要的结果是这样的:

./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat

如何使用 shell/awk/grep/sed 或其他命令行工具获取此信息?

【问题讨论】:

    标签: shell awk sed


    【解决方案1】:

    请您尝试关注一次。

    awk -F'/' '!a[$2]++' Input_file
    

    【讨论】:

    • 是的!这正是我想要的。谢谢。
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -E ':a;N;s/^(([^/]*\/[^/]*\/).*)\n\2.*/\1/;ta;P;D' file
    

    在整个文件中打开一个 2 行的窗口,并删除所有重复的目录,只打印第一个。

    要打印一组副本中的最后一个文件,请使用:

    sed -E 'N;/^([^/]*\/[^/]*\/).*\n\1/!P;D' file
    

    【讨论】:

      【解决方案3】:

      使用 Perl

      perl -F"/" -lane ' print unless $kv{$F[1]}++ ' 
      

      使用给定的输入

      $ cat leonard.txt
      ./12345/a1abeff031.dat
      ./12345/a1abeef03a.dat
      ./12345/a1abefa032.dat
      ./12346/c3abeff031.dat
      ./12346/a1abeff031.dat
      ./12347/a2abeff021.dat
      $ perl -F"/" -lane ' print unless $kv{$F[1]}++ ' leonard.txt
      ./12345/a1abeff031.dat
      ./12346/c3abeff031.dat
      ./12347/a2abeff021.dat
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多