Corresponder padrão em um arquivo e imprimir a palavra correspondente (não a linha inteira) na segunda coluna

2

Estou tentando combinar o padrão "SHM" em um arquivo contendo as informações abaixo e imprimir a palavra correspondente ao padrão.

LOCALZONE01     ASHM001002003VOL01
                BSHM001002003VOL02
                CSHM001002003VOL03
                DSHM001002003VOL03_DUP
                ESHM001002003VOL04
                FSHM001002003VOL05
                GSHM001002003VOL06_
                HSHM001002003VOL07

Eu tentei usar o awk para imprimir a segunda coluna:

grep "SHM" <filename.txt> | awk -F" " '{print $2}'

ASHM001002003VOL01

Se eu tentar imprimir a coluna 1, será exibida a saída abaixo:

LOCALZONE01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

Abaixo está minha saída desejada. Como posso obtê-lo?

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
    
por xrkr 12.09.2018 / 18:37

6 respostas

4

Se a saída desejada for sempre o último campo no arquivo, tente isto

awk '{if ($NF ~ /SHM/) {print $NF}}' _input_file_

Espero que isso ajude.

    
por 12.09.2018 / 20:50
5

Se você tem o GNU grep disponível,

grep -Eo '[[:alnum:]_]*SHM[[:alnum:]_]*' < filename.txt

Se não, você poderia pedir ao awk para percorrer os campos de cada linha, procurando por SHM:

awk '{ for(i=1;i<=NF;i++) if ($i ~ /SHM/) print $i }' < filename.txt
    
por 12.09.2018 / 18:54
3

Como a primeira coluna dos seus dados de exemplo não tem entradas que começam com a linha nº 2 e daqui para frente, você precisará analisá-las como fixed-width colunas. Você pode fazer isso:

$awk 'BEGIN {FIELDWIDTHS = "16 40"} /SHM/ { print $2}'
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
    
por 12.09.2018 / 18:47
2

Você pode fazer isso da seguinte maneira usando Perl :

perl -lne 'print for /\w*SHM\w*/g' input-file.txt

perl -lane 'print for grep /SHM/, @F' input-file.txt # assuming SHM fields r alphanumeric

Ou, com o editor sed em uma maneira POSIX - compatível , assumindo todas as linhas pelo menos um SHM

sed -ne '
    s/[[:alnum:]_]*SHM[[:alnum:]_]*/\
&\
/;s/.*\n\(.*\n\)//;P;/\n$/!D
' input.txt

Saída:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
    
por 12.09.2018 / 20:28
1
awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'

Saída:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

Isso imprime a segunda coluna na primeira linha, as linhas a seguir e, em seguida, remove o espaço em branco para corrigir a formatação e retornar a saída desejada.

    
por 12.09.2018 / 18:58
0

awk '{head = substr ($ 0,1,16); mypat = substr ($ 0,17,23); if (mypat ~ / SHM /). {print mypat}} 'nome do arquivo

    
por 14.09.2018 / 17:59