다음 정보가 포함된 파일에서 "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
그러면 첫 번째 행의 두 번째 열인 다음 행이 인쇄된 다음 공백을 제거하여 서식을 수정하고 원하는 출력을 반환합니다.