代码之家  ›  专栏  ›  技术社区  ›  jerik

从管道输出中删除空白

  •  0
  • jerik  · 技术社区  · 6 年前

    在文本文件中,我有一些带有符号的标记 :foo 。要获取文件中我的标记的概述,我想获取所有这些标记的列表。

    这是通过

    grep -o -e ":[a-z]*\( \|$\)" file.txt | sort |  uniq
    

    现在,由于末尾的空格或换行符,我得到了重复的字符。

    :movie  <-- only newline
    :movie  <-- whitespace and newline
    :read
    :read 
    

    我想避免重复。但我不知道怎么做。我试过了 | tr -d '[:space:]' ,但这只会导致所有管道输出的串联。。。

    文件的示例。txt文件

    Avengers: Infinity War :movie
    Yojimbo 1961 :movie nippon
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   James Brown    6 年前

    一些测试线(第一条测试线后有一个空格 :space ,如果用鼠标突出显示数据,则可以看到):

    $ cat file
    with :space 
    with :space too
    without :space
    test: this
    

    具有 grep ,则, sort uniq :

    $ grep -o ":[a-z]\+" file | sort | uniq 
    :space
    

    有awk(好吧,至少是呆呆的):

    $ awk 'BEGIN{RS="[" FS "|" RS "]+"}/:[a-z]/&&!a[$0]++' file
    :space
    

    每个单词都是它自己的记录,我们选择每个冒号起始单词的第一个实例。 RS="[" FS "|" RS "]+" 可以用其他方式书写,但此形式旨在强调 FS RS

        2
  •  1
  •   perreal    6 年前

    您可以使用Perl regexp和单词匹配:

    grep -oP ':\w+' file.txt | sort |  uniq
    

    或者,只需匹配非空格字符:

    grep -o ':[^ ]*' file.txt | sort |  uniq
    
        3
  •  0
  •   RavinderSingh13 Nikita Bakshi    6 年前

    由于您没有提供示例Input\u文件,因此无法对其进行测试,我也没有随身携带zsh。尝试以下内容,并让我知道这是否对您有帮助。

    awk '/:[a-z]*/{sub(/ +$/,"");} !a[$0]++' Input_file | sort
    
        4
  •  0
  •   ctac_    6 年前

    你可以试试sed

    sed 's/.*\(:[a-z]*\).*/\1/' file.txt | sort | uniq