awk 일치에서 변수를 어떻게 전달합니까?

awk 일치에서 변수를 어떻게 전달합니까?

awk 명령이 있습니다. 변수를 사용해야 i하는데 이렇게 하면 명령이 작동하지 않습니다.

"fechaName": "1", "firstName": "gdrgo", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx "":"존","성":"222",dfg
"fechaName": "2", "xxxxx": "John", "Name": "Beto", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", " 마지막 이름" ": "111", "xxxxx": "존",
"fechaName": "4", "xxxxx": "John", "Name": "Beto", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", " 마지막 이름" ": "111", "xxxxx": "존",
"fechaName": "4", "xxxxx": "John", "xxxxx": "John", "FirstName": "beto2", "xxxxx": "John", "Lastname": "555", "xxxxx " ": "존", "xxxxx": "존",
"fechaName": "5", "xxxxx": "John", "xxxxx": "John", "FirstName": "beto2", "xxxxx": "John", "Lastname": "444", "xxxxx " ": "존", "xxxxx": "존",
"fechaName": "4", "firstName": "gdrgo", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx" "":"존","성":"222",dfg
"fechaName": "7", "xxxxx": "John", "xxxxx": "John", "이름": "beto2", "xxxxx": "John", "성": "444", "xxxxx " ": "존", "xxxxx": "존",

대신 5를 사용하면"나"효과가있다

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /5"/) )  print $0 }'   sumacomando

이건 내 명령이야

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /**i**"/) )  print $0 }'   sumacomando

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /i"/) )  print $0 }'   sumacomando

답변1

한 번에 모든 레코드를 정렬할 수는 없습니다.

문자 그대로 주요 질문에 대답하고 필드를 변수와 일치시키려면 이를 수행하지 않아도 됩니다 match($2,i)( /.../또는 뒤에 match($2, i "\""). 가 오고 일반 문자열 연결 구문을 사용함).i"

이렇게 해도 "4"가 포함된 레코드에 대해 올바른 결과가 제공됩니다.

awk '{i=4}$0 ~ "\"" i "\""' file1 #(string concatenation yelds to "4")

하지만 이 방법은 잘 작동하지만 예상한 대로 데이터를 한 번에 자동으로 정렬하지 않습니다.

awk '{for (i=1;i<8;i++) if ($0 ~ "\"" i "\"") print}' file1

모든 기록을 정렬하려면 먼저 모든 기록을 메모리에 로드한 다음 정렬된 순서로 인쇄해야 합니다.

예제 파일에 적용되는 다른 접근 방식은 다음과 같습니다.

awk  -F"[\"]" '{a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0;last=NR}END{for (i=1;i<=last;i++) if (a[i]) print a[i]}' file1

여기에서 온라인 테스트를 확인하세요.

" 첫 번째 줄의 구분 기호 텍스트를 사용하면 "fechaName": "1",....4개 부분으로 나누어지며 1(필드 $4)는 정수로 직접 사용할 수 있습니다.

이 부분은 a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0if-then-else에 불과합니다.

a[$4](==> 첫 번째 줄에 대해) 이미 값이 있으면 a[1]출력 레코드 구분 기호(ORS)를 사용하여 a[$4]의 이전 내용에 이 줄을 추가합니다. 이는 새 줄(또는 짧은 "\ n") - 그렇지 않으면 $0을 a[$4]에 적용합니다.

마지막으로 마지막 부분에서는 이 배열 a를 인쇄합니다.

여기서는 이 작업의 경우 정렬이 awk보다 훨씬 빠르다고 말해야 합니다.

LC_ALL=C sort -t"\"" -k3 file1

답변2

1부터 7까지의 행을 인쇄하려는 것 같습니다. 그건 이렇겠지

awk '/"fechaName": "[1-7]"/ { print }'

관련 정보