awk 명령에서 변수 사용

awk 명령에서 변수 사용

나는 노력한다

for ds in $(cat Nikhil/strings.txt )
do
awk -v k="$ds" '{if (substr($0,2,5) == k )print $0}' criteria5.txt
done

하지만 이렇게 하면 변수 대신 k 값이 k로 제공됩니다. Shell check .net이 작동하지 않아 여기에 게시해야 했습니다.

+ for ds in '$(cat Nikhil/strings.txt )'

+ awk -v k=CDA01 '{if (substr($0,2,5) == k )print $0}' criteria5.txt

이것은 sh -x를 사용하여 디버깅을 시도할 때의 출력입니다. 어떤 제안이라도 부탁드립니다

답변1

귀하의 코드에서 무슨 일이 일어나고 있는지 재현할 수는 없지만 모든 것이 구문적으로 훌륭하고 작동한다는 것을 알았습니다. 그러나 이것이 쉘 루프로 수행하려는 작업인 것으로 보이며 그렇게 하는 것이 더 나을 것입니다.그것에 열중. 아래에서는 awk명령만 사용합니다.

gawk 'ARGIND==2{ strings[$0]; next; };
     (substr($0, 2, 5) in strings);
' RS='[[:space:]]+' strings.txt RS='\n' criteria.txt

여기서는 모든 문자열을 읽습니다( \n공백 또는 ewline으로 분할).[[:space:]]"문자열.txt"파일은 awk연관된 배열에 저장됩니다(이름을 로 지정하겠습니다 strings).

입력을 제어 ATGIND==2하고 첫 번째 코드 블록만 실행"문자열.txt"파일과다음 입력을 위해 블록 실행을 건너뜁니다. 이봐우리가 더 일반적인 사용보다 이것을 선호하는 이유NR==FNR.

다음 파일은 언제?"표준.txt"처리를 위해 열었고 레코드 구분 기호를 기본 \newline 으로 설정하여 예상한 대로인지 확인합니다 RS='\n'.(substr($0, 2, 5) in strings)substr영국위치에서 시작2문자 길이는5배열에 존재합니까? 존재한다면 해당 행이 출력으로 이동합니다.

입력 데이터: strings.txt:

CDA01 CDA02
   CDA03
CDA03    CDA05 CDA06

criteria.txt:

xCDA01 something
xxCDA02 someotherthing
CDA01
vcCDA03 oCDA03
vCDA05 end

산출:

xCDA01 something
vCDA05 end

관련 정보