私のコラムには、次のような言葉が書かれています。
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
使用できる拡張正規表現を使用できます。コードは繰り返される単語を探してスキップします。|
or
awk
必要に応じて、これらすべてを 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
コマンドの最後に追加します