Cómo generar columnas con patrones especiales

Cómo generar columnas con patrones especiales

Tengo una columna, con algunas palabras:

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

Debería hacer algunos patrones, donde necesito tener palabra por palabra tres palabras: scatman, batman, superman. Donde tengo palabras repetidas, como scatman y scatman en las líneas 4 y 5 o donde tengo otras palabras, debo cortarlas. He escrito:

grep "scatman\|batman\|superman" file

Ok, he rechazado la palabra WWWWWWWW, pero no puedo entender cómo mostrar mi columna palabra por palabra. Tengo como resultado:

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

En las líneas 4 y 5 tengo palabras repetidas, pero eso no me gusta. ¿Dónde tengo el error?

Respuesta1

Esto hará exactamente lo que quieras.

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

Imprimirá cada palabra en una nueva línea como esta:

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

o en una línea como esta:

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

Respuesta2

Esto se puede hacer con grepy 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 

Permite grep -Euna expresión regular extendida que le permite usarla |como orobjetivo de búsqueda. El awkcódigo busca palabras repetidas y las omite.

Puedes hacer todo esto en una línea, si quieres:

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`

Respuesta3

greping algo

En las líneas 4 y 5 tengo palabras repetidas, pero eso no me gusta.

para omitir líneas repetidas: agregue | uniqal final de su comando

información relacionada