awk 명령은 열 1과 2의 부분 일치에 대한 출력을 제공하지 않습니다.

awk 명령은 열 1과 2의 부분 일치에 대한 출력을 제공하지 않습니다.

변수와 일치하고 출력을 제공하는 다음 스크립트를 실행하는 데 도움을 주십시오. 스크립트가 작동 중입니다.정밀한열 1과 2와 일치하지만,부분의성냥.

cat ~/bin/MYSH

#!/bin/bash
arg="${1:?}"
awk -v arg="${arg//\\/\\\\}" '$1 == arg || $2 == arg' "$@"  inputfile

입력 파일-

1111       1111RETAIL          RETAIL8888Node  
2222       2222RETAIL          RETAIL7777Node 
3333       3333AUDITTEST       AUDIT6666Node
4444       4444AUDIT           AUDIT3333Node
5555       5555SALE            SALE4444Node
6666       6666SALE            SALE2222Node
7777       7777FINANCE         FINANCE1111Node
8888      8888FINANCE          FINANCE5555Node

스크립트는 아래와 같이 열 1 또는 2에 입력된 단어와 정확히 일치하는 항목을 검색하여 출력을 제공합니다.

$ MYSH 6666
6666       6666SALE            SALE2222Node

$ MYSH 4444AUDIT
  4444       4444AUDIT           AUDIT3333Node

또한 아래와 같이 열 2에 2~3개 또는 일치하는 문자가 있는 경우 출력을 제공하려면 이 스크립트가 필요합니다.

예상 출력 -

$ MYSH 4444AU
  4444       4444AUDIT           AUDIT3333Node

또는

 MYSH 7777FINAN
  7777       7777FINANCE         FINANCE1111Node

답변1

테스트 $1 == arg진짜arg첫 번째 필드의 값이 변수와 동일한 경우. 값이 의 arg어딘가에서 찾을 수 있는지 테스트하려면 $1이 함수를 사용할 수 있습니다 index(). 이 함수는 하위 문자열이 발견된 위치를 반환하거나, 발견되지 않은 경우 0을 반환합니다.

#!/bin/sh

arg=${1:?} awk 'index($1,ENVIRON["arg"]) || index($2,ENVIRON["arg"])' inputfile

필드 시작 부분에서만 하위 문자열이 일치하도록 하려면 index()함수의 반환 값이 1인지 확인하세요.

#!/bin/sh

arg=${1:?} awk 'index($1,ENVIRON["arg"])==1 || index($2,ENVIRON["arg"])==1' inputfile

또한 스크립트의 첫 번째 인수를 awk환경 변수로 명령에 전달하여 백슬래시를 이중 슬래시로 변경하지 않고도 사용할 수 있도록 했습니다.

하나할 수 있다$1 ~ ENVIRON["arg"]사용자 제공 값을 첫 번째 필드 값에 대한 정규식으로 사용하여 정규식 일치를 수행하는 사용 (또는 $1 ~ "^" ENVIRON["arg"]처음에만 일치) 도 가능합니다 . 그러나 이는 사용자가 자신이 제공하고 있다는 것을 알지 않는 한 부적절합니다.정규식문자열보다는.

관련 정보