UNIX/Linux에서 열 재정렬

UNIX/Linux에서 열 재정렬

각 레코드의 세 번째 열에 있는 고유 키를 첫 번째 열로 이동해야 합니다. 이제 이 키를 기반으로 각 레코드에는 서로 다른 총 열 수(필드 수를 의미)가 있습니다.

파일 내용은

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루프를 사용하여 이 작업을 수행하는 것이 좋지만 두 필드만 이동하는 경우에는 약간 과잉인 것처럼 보입니다.

관련 정보