假设我有以下文件:
one two three
two three four
three four four
three four five
如何确定哪一行有一个连续重复的单词?我试图获得如下输出:
3:four:three four four
首先是行号,然后是单词,然后是单词出现的行。
这是我到目前为止所做的:
while read line
do
echo $line > file
sed -e 's/ /\'$'\n/g' file | sort | uniq -c | sort -nr | head -1
done < $1
我不确定如何继续。输出目前是:
1 two
1 two
2 four
1 three
我在考虑传递
的输出
head -1
到一个自定义脚本,它将频率和单词作为参数,但必须有一种更简单的方法来实现它。
答案 0 :(得分:2)
使用awk
:
awk '{for(i=1;i<=NF;i++)if($i==$(i+1)){print NR,$i,$0 }}' OFS=':' file
$ awk '{for(i=1;i<=NF;i++)if($i==$(i+1)){print NR,$i,$0 }}' OFS=':' file
3:four:three four four
:
分隔的整行。 答案 1 :(得分:0)
除了打印行号,这样做:
sed -n -r '/\b([^ ]+) \1\b/s/^.*\b([^ ]+) \1\b/\1:&/p'
答案 2 :(得分:0)
如果Perl解决方案没问题,那么这可能会有所帮助:
perl -lne '/\b(\w+) \1\b/ && print join ":",$.,$1,$_;' file
答案 3 :(得分:0)
您可以尝试以下方法:
cat -n stack | sed -n -r '/\b([^ ]+) \1\b/s/^.*\b([^ ]+) \1\b/\1:&/p' | sed 's/ / /' | awk '{ i = $1; $1 = $2":"; $2 = i; print; }'
使用cat -n对行进行编号,然后使用Barmar的sed命令。之后,您将删除所有额外的空格,切换第1列和第2列的值并将其打印出来。尽可能接近我:
3: four: three four four
答案 4 :(得分:0)
您可以使用带正则表达式匹配的BASH循环来执行此操作。
n=1
while read -a line; do
for i in ${line[@]}; do
if [[ ${line[@]} =~ ($i).*($i) ]]; then
echo "${n}:${i}:${line[@]}"
break
fi
done
((n++))
done < $1