使用shell/awk仅打印一次相同的连续行
我的意见如下:使用shell/awk仅打印一次相同的连续行,shell,awk,Shell,Awk,我的意见如下: Sep 9 09:22:11 Hello Hello Sep 9 10:23:11 Hello Hello Hello Sep 10 11:23:11 我希望输出如下:(相同的连续行仅替换为一行) 谁能帮我用shell或awk快速解决这个问题 使用awk,您可以执行以下操作: awk '$0 != prev; {prev=$0}' file Sep 9 09:22:11 Hello Sep 9 10:23:11 Hello Sep 10 11:23:11 命令分解: $0
Sep 9 09:22:11
Hello
Hello
Sep 9 10:23:11
Hello
Hello
Hello
Sep 10 11:23:11
我希望输出如下:(相同的连续行仅替换为一行)
谁能帮我用shell或awk快速解决这个问题 使用awk,您可以执行以下操作:
awk '$0 != prev; {prev=$0}' file
Sep 9 09:22:11
Hello
Sep 9 10:23:11
Hello
Sep 10 11:23:11
命令分解:
$0 != prev; # if previous line is not same as current then print it
{prev=$0} # store current line in a variable called prev
要删除重复的行,请使用uniq:
uniq File
使用示例输入,例如:
$ uniq File
Sep 9 09:22:11
Hello
Sep 9 10:23:11
Hello
Sep 10 11:23:11
虽然它的名字可能意味着uniq与唯一的行有关,但它不是:它查找相邻的重复行,并在默认情况下删除重复行。只是因为您也要求shell,尽管给出的答案都是更好的解决方案-
last=''
while read line
do if [[ "$line" -eq "$last" ]]
then continue
else echo "$line"
last="$line"
fi
done < infile
last=''
读行时
如果[[“$line”-eq“$last”]]
然后继续
else回显“$line”
最后一行“$line”
fi
完成<填充
这是简单、清晰的,并且可能比
awk
或uniq
慢。您是对的。我认为该命令不会查找相邻的重复行。实际上,它工作得很好。非常感谢,我很高兴知道它成功了,
last=''
while read line
do if [[ "$line" -eq "$last" ]]
then continue
else echo "$line"
last="$line"
fi
done < infile