Como gerar coluna com padrões especiais

Como gerar coluna com padrões especiais

Eu tenho uma coluna, com algumas palavras:

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

Eu deveria fazer alguns padrões, onde preciso ter três palavras palavra por palavra: scatman, batman, superman. Onde eu tiver palavras repetidas, como scatman & scatman nas linhas 4 e 5 ou onde tiver outras palavras, devo cortá-las que escrevi:

grep "scatman\|batman\|superman" file

Ok, rejeitei a palavra WWWWWWWW, mas não consigo entender como mostrar minha coluna palavra por palavra. Eu tenho como resultado:

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

Nas linhas 4 e 5, repito palavras, mas não gosto disso. Onde eu tenho o erro?

Responder1

Isso fará exatamente como você deseja

#!/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

Irá imprimir cada palavra em uma nova linha como esta:

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

ou em uma linha como esta:

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

Responder2

Isso pode ser feito com grepe 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 

O grep -Epermite uma expressão regular estendida que permite usar |como oralvos de pesquisa. O awkcódigo procura palavras repetidas e as ignora.

Você pode fazer tudo isso em uma linha, se quiser:

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`

Responder3

pegando alguma coisa

Nas linhas 4 e 5 eu repito palavras, mas não gosto disso

para omitir linhas repetidas: adicione | uniqno final do seu comando

informação relacionada