解析文件以打印重复的单词并在相邻的行上打印 - bash脚本

时间:2017-10-20 19:49:24

标签: bash text-processing

示例列表:

goodbye  
goodbye  
hello  
hi  
hi  
hi  
no

预期产出:

goodbye goodbye  
hello  
hi hi hi   
no  

我想要打印甚至是'不像'这个词,也就是单独的一行。但是在同一条线上的任何匹配。可以' tr'与循环一起使用?

 #!/bin/bash

 while read line
 do
     if [$var == $var]
     then
        echo $var | tr -s ' '

        else
        echo $var | tr '\n' 

     fi

 done < foo.txt

3 个答案:

答案 0 :(得分:0)

awk 单行:

awk '{ printf "%s%s",(NR==1? "": (r==$1? FS:ORS)),$0; r=$1 }END{ print "" }' file

输出:

goodbye goodbye
hello
hi hi hi
no

答案 1 :(得分:0)

使用 awk

如果所有匹配的单词都在连续的行中(如输入中那样),那么您可以使用此解决方案。

$awk 'FNR==1{a=$0; ORS=" "} a!=$0{a=$0; $0=RS $0} END{printf RS}1' file

goodbye goodbye 
hello 
hi hi hi 
no

答案 2 :(得分:0)

一个简单,纯粹的bash解决方案,可以扩展您的尝试:

#!/bin/bash
first=1
while read word; do
    if (( first )); then
        printf "%s" "$word"
        first=0
    else
        if [[ $word == $prev ]]; then
            printf " %s" "$word"
        else
            printf "\n%s" "$word"
        fi
    fi
    prev="$word"
done < foo.txt
echo

对于从输入文件中读取的每个word,我们检查它是否与上一个打印的单词相同;如果是的话 - 我们继续在同一行打印;如果不是 - 我们打破序列并在新行中打印新单词。

第一个单词始终打印时没有任何前缀(空格/换行符),因此我们通过first变量处理该特殊情况。

使用printf命令代替echo,因为它对输出(格式)有更好的控制,但也可以使用echo -n