전달된 배열의 길이를 변수로 사용하는 다음 awk 스크립트가 있습니다.
BEGIN {
FPAT = "([^,]*)|(\"[^\"]*\")"
len=split(_arr,arr," ")
}
{
for(i=1;i<=len;i++){
print("i: " i " value i: " $i)
}
}
다음 명령의 경우
gawk -F ',' -v _arr="(1 2 3)" -f stackOverflow.awk example2.csv
그리고 다음 입력
,112,41/12/2023
new,23,21/10/2022
,421,11/01/12
abce,421,11/14/12
내가 얻는 결과는 다음과 같습니다.
i: 1 value i:
i: 2 value i:
i: 3 value i:
i: 1 value i: new
i: 2 value i: 23
i: 3 value i: 21/10/2022
i: 1 value i:
i: 2 value i:
i: 3 value i:
i: 1 value i: abce
i: 2 value i: 421
i: 3 value i: 11/14/12
하지만 아래와 같이 len 대신 NF를 사용하면
BEGIN {
FPAT = "([^,]*)|(\"[^\"]*\")"
len=split(_arr,arr," ")
}
{
for(i=1;i<=NF;i++){
print("i: " i " value i: " $i)
}
}
내가 원하는 결과를 얻습니다.
i: 1 value i:
i: 2 value i: 112
i: 3 value i: 41/12/2023
i: 1 value i: new
i: 2 value i: 23
i: 3 value i: 21/10/2022
i: 1 value i:
i: 2 value i: 421
i: 3 value i: 11/01/12
i: 1 value i: abce
i: 2 value i: 421
i: 3 value i: 11/14/12
나는 그것을 사용하고 있다
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.
동일한 버전을 사용하는 것을 선호합니다
답변1
여기서는 문자열을 분할하는 몇 가지 다른 방법을 혼합하고 있습니다. FPAT
with 섹션에서 문자열을 정의하고 명령줄에서도 with를 정의한 다음 필드 구분 기호로 분할을 호출하면 및 를 모두 무시하도록 지시합니다.BEGIN
FPAT = "([^,]*)|(\"[^\"]*\")"
FS
-F ','
" "
split(_arr,arr," ")
FS
FPAT
그런 다음 코드에서 마지막으로 정의된 OR NF
기반의 IS 설정을 사용하려고 시도하지만 (귀하의 코드에서는 이것이 고려될 것이라고 생각하지만 그렇게 하지 마십시오) 어떤 이유로 완전히 관련 없는 작업을 원합니다. 필드 구분자로 하드코딩 의 출력은 동일합니다.FS
FPAT
FPAT
len
split()
" "
또한 FS와 FPAT는 입력 파일의 행을 분할하는 동시에 변수로 전달된 문자열의 내용을 분할합니다 split(_arr,...," ")
. 두 가지는 전혀 관련이 없습니다._arr
또한 문자열을 전달 _arr="(1 2 3)"
하지만 이를 배열이라고 부르고 이를 실제 배열로 분할하면 (1
and 2
및 3)
(해당 부분에 괄호 포함)이 있지만 배열에는 없습니다. 다음 중 하나를 사용하세요. 가치 스크립트.
따라서 코드가 해당 방식으로 작동하는 이유는 분명합니다(필드 구분 기호에 대한 3가지 다른 정의가 있고 len
분할로 설정, 내용별로 설정 또는 내용별로 분할). 무엇을 하려는지 명확하지 않습니다. 또는 저희가 도와드릴 수 있습니다. 당신은 모든 일을 올바르게 수행합니다.split(_arr,...," ")
_arr
NF
FS
FPAT
$0
하지만 gawk의 이전 버전에는 FPAT 버그가 있습니다. 이러한 문제에 대한 설명과 해결 방법은 다음 스레드를 참조하세요.
남은 것이 있습니다.
- https://lists.gnu.org/archive/html/bug-gawk/2015-09/msg00034.html
- https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html
그리고 5.0.1(현재 버전은 5.2.1)보다 최신 버전의 gawk를 받으세요.