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.
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
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
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
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_
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.
awk '{head = substr ($ 0,1,16); mypat = substr ($ 0,17,23); if (mypat ~ / SHM /). {print mypat}} 'nome do arquivo