파일의 패턴을 일치시키고 두 번째 열(전체 줄이 아님)에 일치하는 단어를 인쇄합니다.

파일의 패턴을 일치시키고 두 번째 열(전체 줄이 아님)에 일치하는 단어를 인쇄합니다.

다음 정보가 포함된 파일에서 "SHM" ​​패턴을 일치시키고 패턴과 일치하는 단어를 인쇄하려고 합니다.

LOCALZONE01     ASHM001002003VOL01
                BSHM001002003VOL02
                CSHM001002003VOL03
                DSHM001002003VOL03_DUP
                ESHM001002003VOL04
                FSHM001002003VOL05
                GSHM001002003VOL06_
                HSHM001002003VOL07

awk를 사용하여 두 번째 열을 인쇄하려고 합니다.

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

ASHM001002003VOL01

열 1을 인쇄하려고 하면 다음과 같은 결과가 출력됩니다.

LOCALZONE01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

아래는 내가 원하는 출력입니다. 어떻게 얻을 수 있나요?

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

답변1

GNU grep을 사용할 수 있는 경우,

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

그렇지 않은 경우 각 행의 필드를 반복하여 SHM을 찾도록 awk에 요청할 수 있습니다.

awk '{ for(i=1;i<=NF;i++) if ($i ~ /SHM/) print $i }' < filename.txt

답변2

원하는 출력이 항상 파일의 마지막 필드인 경우 다음을 시도하십시오.

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

답변3

샘플 데이터의 첫 번째 열에는 행 2 이상에서 시작하는 항목이 없으므로 이를 fixed-width열로 구문 분석해야 합니다. 다음을 수행할 수 있습니다.

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

답변4

awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'

산출:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

그러면 첫 번째 행의 두 번째 열인 다음 행이 인쇄된 다음 공백을 제거하여 서식을 수정하고 원하는 출력을 반환합니다.

관련 정보