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-0001
FS
;
FS
-
device
awk
FS
답변1
귀하의 경우에는 sub()
사용하기에 충분한 것 같습니다. $3
즉 DEVICE-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가 행에 수행하는 작업을 문자열에 수행할 수 있습니다.