FS가 이미 사용 중일 때 awk를 사용하여 문자열을 분할하는 방법은 무엇입니까?

FS가 이미 사용 중일 때 awk를 사용하여 문자열을 분할하는 방법은 무엇입니까?

file.csv다음이 있다고 가정해 보겠습니다 .

id;filename;device
1;118574934-20220503-17h44m20s101;
2;118574934-20220503-17h44m20s101;
3;118574934-20220503-17h44m20s101;DEVICE-0001-33
4;118574934-20220503-17h44m20s101;DEVICE-0001-33
5;118574934-20220503-17h44m20s101;DEVICE-0001-33
6;118574934-20220503-17h44m20s101;DEVICE-0001-33
7;118574934-20220503-17h44m20s101;DEVICE-0001-33

awk내 파일에 장치 이름이 나타날 때 장치 이름을 가져오고 실행을 완료하는 스크립트를 만들었습니다 . 그 script.awk기능은 다음과 같습니다:

BEGIN {
    FS=";"
}
NR > 1 { fileName = $2 }
NR > 1 { if ( $3 != "" ) { device = $3; exit} }
END {
    if ( device == "" ) {
        line = "UNCONNECTED_"fileName".txt;UNCONNECTED"
    } else {
        line = device"_"fileName".txt;"device
    }
    print "filename;folder"
    print line
}

실행 후 출력은 다음 awk -f script.awk file.csv과 같습니다.

filename;folder
DEVICE-0001-33_118574934-20220503-17h44m20s101.txt;DEVICE-0001-33

문제는 이미 with를 사용했고 as를 다시 사용하여 변수를 분할 할 수 없기 때문에 문자열 DEVICE-0001-33을 . 만 사용하여 이 문제를 어떻게 처리할 수 있습니까 ? 변수를 사용한 후 특정 문자와 변수를 어떻게 분리할 수 있습니까 ?DEVICE-0001FS;FS-deviceawkFS

답변1

귀하의 경우에는 sub()사용하기에 충분한 것 같습니다. $3DEVICE-0001-33, 을 변수에 할당하고 싶지 않고 해당 변수의 하위 문자열을 사용하세요. 이것이 -내부 구분 기호라고 가정하면 마지막 필드를 제거하려고 합니다.

echo "DEVICE-0001-33" | awk '{sub(/-[^-]*$/,"",$1); print}'

DEVICE-0001

우리는 -[^-]*$마지막 구분 기호와 마지막 필드를 얻는 데 사용합니다. -.*$욕심이 많아서 첫 밭만 빼고 다 먹어치우기 때문 만은 아닙니다 . 교체는 빈 문자열입니다 "". 그리고 그 결과를 이 필드에 씁니다. 그래서 당신 device = $3

sub(/-[^-]*$/,"",$3); device = $3

귀하의 질문 제목에 대한 일반적인 대답은 이 split()기능을 사용하는 것입니다. 와 다른 것을 사용할 수 있습니다 FS. 이 예에서는 수행되는 작업을 설명합니다.

echo "DEVICE-0001-33" | awk -v s='-' '{
    n=split($1,arr,s)
    print "number of fields: " n
    print "separator: " s
    for (i=1;i<=n;i++) print "field: " i " value: " arr[i]
}'

number of fields: 3
separator: -
field: 1 value: DEVICE
field: 2 value: 0001
field: 3 value: 33

awk가 행에 수행하는 작업을 문자열에 수행할 수 있습니다.

관련 정보