다음 형식의 csv 파일이 있습니다.
1,123-456,IND,91,UAE,97,USA,01,SA,27
3,345-678,AUS,61,SLA,94,NZW,64,RS,7
AWK 명령을 사용하여 이를 달성하는 방법에 대해 아래에 설명된 대로 ,(\w{3}),(\d{2}),
패턴 검사와 구분 기호에 일치 항목을 표시해야 하는 횟수를 기반으로 검사 해야 합니다 .|
예상 출력
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64
답변1
당신이 그렇게 말할 때 , 숫자와 밑줄도 일치하기 때문에 실제로 문자만 원하는 것처럼 보인다는 \w+
뜻이라고 가정합니다 . 실제로 귀하의 예에 따르면 아마도 대문자만 필요할 것입니다. 마지막으로 다시 추측해 보니 설명을 안 해주셔서 알파벳 문자열이 정확히 3글자가 아닌 경우는 제외하고 싶으신 것 같습니다. 그렇다면 Perl에서 원하는 작업을 수행하는 방법은 다음과 같습니다.[a-zA-Z]
\w
$ perl -lne '/^(.*?),[A-Z]{3},\d{2},/; $start=$1; @k=(/,(\w{3},\d{2})/g); print "$start,", join("|",@k)' file
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64
또는 두 번째 필드 이후에만 일치시키려는 경우 awk에서 이를 수행할 수 있습니다.
$ awk -F, -v OFS="," '{
for(i=3;i<=NF;i+=2){
if ($i~/^[A-Z]{3}$/ && $(i+1)~/^[0-9]{2}$/){
k ? k=k"|"$i","$(i+1) : k=$i","$(i+1);
}
} print $1,$2,k; k=""}' file
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64