텍스트 파일을 정렬하고 편집하여 새 파일을 출력합니다.

텍스트 파일을 정렬하고 편집하여 새 파일을 출력합니다.

이 문제에는 여러 단계가 있습니다.

다음 데이터가 있는데 먼저 2열, 5열, 1열 순으로 정렬하고 싶습니다. 그런 다음 열 5와 6을 구분 기호로 결합하고 싶습니다. 값이 변경되면 5에서 6 사이의 새 값이 새 데이터를 인쇄합니다. 상단에는 5-6의 새로운 값이 있습니다.

어쩌면 예가 도움이 될 것입니다.

원시 데이터.

fldr   cable   pdu_edit stu     grnd_sta chan_pdu

64      3       1       13      145     156     
66      3       1       13      145     156     
79      1       1       9       97      108     
117     3       1       13      145     156     
240     3       1       13      145     156     
255     3       1       13      145     156     
263     3       1       13      145     156     
291     3       1       13      145     156     
817     1       1       9       97      108     
946     1       1       9       97      108    

인쇄했을 때의 모습은 다음과 같습니다.

Cable 1

97-108                         
79,817,946

Cable 3

145-156  
64,66,117,240,255,263,291

아직 멀리 가지 못했어요. 정렬하기 위해 다음을 사용했습니다.

sort -k2 -k5 -k1 filename.txt

그런 다음 인쇄하려면 다음을 사용합니다.

awk '{if ($2==1 && $5==97) {print $1}}' filename.txt | xargs | sed -e 's/ /,/g' | sort 

하지만 위의 경우에는 케이블 번호와 grnd_sta에서 찾는 번호를 선택합니다. 그러나 나는 이것에 익숙하지 않으며 걷는 법을 배우기 전에 달리기를 시도해 볼 것이라고 생각합니다. 예제와 같은 텍스트 파일을 생성하기 위해 이것을 어떻게 조합하는지 잘 모르겠습니다. 케이블 번호에 따라 grnd_sta가 변경되도록 if 함수를 사용해야 한다고 생각합니다.

답변1

SQL의 경우 이는 간단한 작업처럼 보입니다.

csv+ sql== csvsql에서csvkit!

pip를 통해 설치할 수 있습니다.

시작하기 전에 이 작업을 수행하기 전에 파일을 수정하고 싶을 수도 있습니다. 각 줄 끝의 빈 줄과 공백을 제거하세요.

sed -i.bak '2d;s/[[:blank:]]*$//' file

중간에 포기할 수 있습니다.

csvsql \
    -d' ' -S \
    --query 'select cable,grnd_sta || "-" || chan_pdu,group_concat(fldr) from file group by cable' \
    file \
| csvformat -D' '
  • 파일이 탭으로 구분된 경우 대신 필요할 수 있습니다 -t.-d' '
  • csvformat -D' '쉼표로 구분된 출력만 출력되므로 공백으로 구분된 출력을 얻는 데 사용됩니다 csvsql. 처리하기가 더 쉽지만 awkcsvsql은 우리가 원하지 않는 마지막 열 주위에 따옴표를 붙입니다!

산출:

cable "grnd_sta || ""-"" || chan_pdu" group_concat(fldr)
1 97-108 79,817,946
3 145-156 64,66,117,240,255,263,291

여기에서 다음을 계속 사용할 수 있습니다 awk.

... \
| awk 'NR>1{printf "Cable %s\n\n%s\n%s\n\n",$1,$2,$3}' \
| head -n-1

산출:

Cable 1

97-108
79,817,946

Cable 3

145-156
64,66,117,240,255,263,291

답변2

필요한 모든 계산이 포함된 Awk 스크립트를 사용하는 것이 좋습니다.

NR==1 { next }
NF==0 { next }
      { a[$2][1]= $5 "-" $6;    
        a[$2][2]= a[$2][2] $1 "," ; }
END   { for (c in a) printf "Channel %d\n%s\n%s\n\n",c,a[c][1],a[c][2] }

용법:

$awk -f x.awk data
Channel 1
97-108
79,817,946,

Channel 3
145-156
64,66,117,240,255,263,291,

관련 정보