각 레코드의 세 번째 열에 있는 고유 키를 첫 번째 열로 이동해야 합니다. 이제 이 키를 기반으로 각 레코드에는 서로 다른 총 열 수(필드 수를 의미)가 있습니다.
파일 내용은
10,,FH,1834,1010 (newline)
11,10,BH,9899,1010 (newline)
21,11,TH,1010,345 (newline)
22,11,DA,34.65 (newline)
23,11,DA,76.89 (newline)
24,11,CC,1010 (newline)
25,11,CC,1011 (newline)
13,10,FT,200.68 (newline)
참고: 파일을 붙여넣을 때 어떻게든 (개행)을 추가하면 모든 레코드가 같은 줄에 있습니다.
아래에 awk 논리를 작성했습니다.
awk -F',' -v OFS=, '{printf "%s" ,$3 OFS; for(i=1;i<=NF;i++) if(i!=3) printf "%s",$i OFS;printf ORS}' test1.csv
이 출력을 얻으십시오
,H,10,,1834,1010
,H,11,10,9899,1010
,H,21,11,1010,345KW
,U,22,11,34.65
,U,23,11,76.89
,H,24,11,1010
,H,25,11,1011
,T,13,10,200.68
원하는 출력은 다음과 같습니다
FH,10,,1834,1010 (newline)
BH,11,10,9899,1010 (newline)
TH,21,11,1010,345 (newline)
..... ...
문제는 내 명령에 있습니다. 세 번째 필드의 한 문자가 쉼표로 대체됩니다.
답변1
awk -F',' '{print $3 "," $1 "," $2 "," $4 "," $5}' test1.csv
출력은 다음과 같습니다
FH,10,,1834,1010
BH,11,10,9899,1010
TH, 21,11,1010,345
DA, 22,11,34.65 ,
DA, 23,11,76.89 ,
CC, 24,11,1010 ,
CC, 25,11,1011 ,
FT,13,10,200.68 ,
이 스크립트 변경으로 줄 끝 문제가 드러날 수 있습니다.
awk -F',' -v OFS=, '{printf "%s" ,$3 OFS; for(i=1;i<=NF;i++) if(i!=3) printf "%s",$i OFS;print ""}' test1.csv
출력은 다음과 같습니다
FH,10,,1834,1010,
BH,11,10,9899,1010,
TH, 21,11,1010,345 ,
DA, 22,11,34.65 ,
DA, 23,11,76.89 ,
CC, 24,11,1010 ,
CC, 25,11,1011 ,
FT,13,10,200.68 ,
답변2
이는 더 간단하며 행 끝에 추가 쉼표를 삽입하지 않고 원하는 수의 필드가 있는 행을 처리합니다. 또한 3개 미만의 필드가 있는 행도 처리합니다.
awk -F, -v OFS=, 'NF > 2 { k=$3; $3=$2; $2=$1; $1=k } { print }' test.csv
입력 필드를 재배열하면 출력 생성이 그만큼 쉬워집니다 print
.
이동해야 할 값이 더 많은 경우(예: 키가 10번째 필드인 경우) for
루프를 사용하여 이 작업을 수행하는 것이 좋지만 두 필드만 이동하는 경우에는 약간 과잉인 것처럼 보입니다.