이 문제에는 여러 단계가 있습니다.
다음 데이터가 있는데 먼저 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
. 처리하기가 더 쉽지만awk
csvsql은 우리가 원하지 않는 마지막 열 주위에 따옴표를 붙입니다!
산출:
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,