파일 변환을 처리하기 위한 awk 함수를 개발 중인데 대체 문제가 발생할 것이라고는 예상하지 못했습니다.
현재 코드:
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $9 in a {$8 = a[$8 FS $9]}
1' File1 File2
따라서 File1은 제가 생성하고 항상 3개의 필드만 갖습니다. 그러나 File2는 여러 파일 중 하나일 수 있으며, 각 파일은 해당 데이터에 액세스하기 위해 서로 다른 매개변수 번호를 사용합니다.
File2.a에는 20개의 매개변수가 있을 수 있으며, 그 중 매개변수 8과 9가 대상 값입니다.
File2.b에는 200개의 매개변수가 있을 수 있으며 그 중 4개와 159개가 대상 값입니다.
이 변경 사항을 어떻게 처리해야 합니까? ${$var}, ${!var}, eval을 시도했지만 echo $var
아무것도 작동하지 않는 것 같습니다.
필수 코드:
NR == FNR {a[$1 FS $2] = $3; next}
${$var1} FS ${$var2} in a {${$var1} = a[${$var1} FS ${$var2}]}
[Where var1 and var2 acts as parameter args for File2]
[var1 = ${16} and var2 = ${25}]
또한: 인식할 수 있는 매개변수 수에 제한이 있나요? 내 반응은 상충되었습니다. $9가 최대값인 것처럼 ${19}는 최대값이고 255이며 시스템 사양에 따라 제한이 없습니다.
편집하다:의견에 요청한 대로 내 질문을 명확히 하려고 노력할 것입니다. 저는 awk를 사용하여 파일의 매개변수를 비교하고 교체하고 있습니다. File1에는 항상 3개의 매개변수가 있으며 처음 2개는 File2의 매개변수와 연결됩니다. File2에는 결정되지 않은 수의 매개변수가 있습니다. file1과 file2 사이의 매개변수 매핑은 변수에 의해 처리됩니다. 그래서 awk에서 위치 매개변수로 변수($var1)를 사용해 보았습니다.
내가 사용하는 경우:
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $9 in a {$8 = a[$8 FS $9]}
1' File1 File2
내 코드가 작동합니다.
내가 사용하는 경우:
var1=9
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $var1 in a {$8 = a[$8 FS $var1]}
1' File1 File2
더 이상 작동하지 않습니다
$9를 ${$var1} / $(!var1) / $$var1 (awk에서)로 바꾸려고했습니다.
이들 중 어느 것도 예상대로 작동하지 않습니다. File Architect에 대해서는 내 내용을 참조하십시오.이전 질문
답변1
이 기호는 $
쉘(예: bash) 및 awk
.
셸에서는 ${name}
변수 확장이 도입되었습니다. 변수가 정수인 경우 액세스되는 변수는 셸의 목록입니다.논쟁. 쉘(bash)에서 최대 인수( 가 없는 경우 {…}
)는 이지만 $9
새 {…}
메모리 요청이 허용되는 한 제한은 없습니다.
액세스 awk
할 수 있는 운영자입니다.$
필드입력 라인. mawk에는 32767개의 가능한 필드라는 엄격한 제한이 있습니다.
$ echo $(seq 80000) | mawk '{print $(32767+2)}'
mawk: program limit exceeded: maximum number of fields size=32767
하지만 GNU awk에서는 그렇지 않습니다.
$ echo $(seq 80000) | awk '{print $(32767+2)}'
32769
awk
내부$
운영자반복 가능(예: !
(및 기타)도 반복 가능):
$ awk 'BEGIN{var=111;print( !!!!!!var )}'
1
$ echo 23 {a..z} | awk '{field=1;print( $$field )}'
v
이것이 당신이 필요로 하는 것에 더 가깝습니까?
awk 'NR == FNR {a[$1 FS $2] = $3; next}
$$indexa FS $$indexb in a {$$indexa = a[$$indexa FS $$indexb]}
' filea indexa=16 indexb=25 fileb
답변2
미래의 검색자를 위해 답을 남겨주세요. pLumo 및 기타 리뷰어가 기고했습니다.
awk와 bash는 '$'를 다르게 취급합니다. 당신은 그것을 사용할 수 있습니다awk -v $var1=$input
-v는 변수를 만드는 데 사용됩니다. $var1은 awk 변수 이름입니다. $input은 bash 변수 이름입니다. Isaac이 언급했듯이 이름이 같을 수도 있습니다.