识别在Bash中连续重复的单词行

时间:2014-03-18 04:08:48

标签: regex string bash

假设我有以下文件:

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

到一个自定义脚本,它将频率和单词作为参数,但必须有一种更简单的方法来实现它。

5 个答案:

答案 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