![awk 명령에서 변수 사용](https://linux55.com/image/186116/awk%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%20%EB%B3%80%EC%88%98%20%EC%82%AC%EC%9A%A9.png)
나는 노력한다
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"처리를 위해 열었고 레코드 구분 기호를 기본 \n
ewline 으로 설정하여 예상한 대로인지 확인합니다 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