この問題にはいくつかの手順があります。
次のデータがありますが、まず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