示例列表:
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
答案 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
。