特殊なパターンで列を出力する方法

特殊なパターンで列を出力する方法

私のコラムには、次のような言葉が書かれています。

scatman
batman
superman
scatman
scatman
batman
superman
scatman
scatman
batman
superman
scatman
batman
WWWWWWWW
superman
scatman
batman
superman
scatman

パターンをいくつか作成する必要があります。3 つの単語を 1 語ずつ並べる必要があります: scatman、batman、superman。4 行目と 5 行目の scatman と scatman のように単語が重複している場合や、他の単語がある場合は、それらを削除する必要があります。次のように書きました:

grep "scatman\|batman\|superman" file

わかりました。WWWWWWW という単語を拒否しましたが、列を単語ごとに表示する方法がわかりません。結果は次のとおりです。

scatman
batman
superman
scatman
scatman
batman
superman
scatman
scatman
batman
superman
scatman
batman
superman
scatman
batman
superman
scatman

4 行目と 5 行目に単語の重複がありますが、これは気に入りません。どこに間違いがあるのでしょうか?

答え1

これはまさにあなたが望むとおりになります

#!/bin/bash
array=(
[0]="scatman"
[1]="batman"
[2]="superman"
)
count=0
while read line; do
    for i in "${array[@]}";
    do
    if [[ $count == 3  ]]; then
    count=0
    fi
    if [[ $line == ${array[$count]} ]]; then
    #echo "$line"
    printf "%s " $line

    # uncomment if you want every word on a new line
    #echo "$line" >> newfile.txt # each word on a line
    #or
    # uncomment if you want all will be on one line
    #printf "%s " $line >> newfile.txt

    count=$((count+1))
    else
    continue
    fi

    done

done < file.txt #this is your original file

次のように、すべての単語を新しい行に出力します。

scatman
batman
superman
scatman
batman
superman
scatman
batman
superman
scatman
batman
superman
scatman
batman
superman
scatman

または、次のように 1 行で記述します。

scatman batman superman scatman batman superman scatman batman superman scatman batman superman scatman batman superman scatman

答え2

grepこれはとを使用して実行できますawk

cat words.txt |
grep -E 'scatman|batman|superman' |
awk '{
      last_word = cur_word
      cur_word = $0
      if (cur_word == last_word)
        next
      else
        print $0
      }' < word.list 

では、検索ターゲットとしてgrep -E使用できる拡張正規表現を使用できます。コードは繰り返される単語を探してスキップします。|orawk

必要に応じて、これらすべてを 1 行で実行できます。

cat words.txt | grep -E 'scatman|batman|superman' | awk '{ last_word = cur_word; cur_word = $0; if (cur_word == last_word) next; else print $0 }' < word.list`

答え3

何かをグレピングする

4行目と5行目に単語の繰り返しがありますが、それは好きではありません

重複行を省略するには、| uniqコマンドの最後に追加します

関連情報