次の行を含むファイルがあります。
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
この目標をどのように達成できますか?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
答え1
見るGNUデータの混合このように使用できますdatamash transpose
。今後のバージョンでは、クロスタブ(ピボットテーブル)もサポートする予定です。
答え2
コマンドラインで行と列を置き換えるカスタムソリューションをスクロールするだけでなく、私が見た唯一のツールはironyというツールです。transpose
。
インストールする
残念ながら、どのリポジトリにもないので、ダウンロードしてコンパイルする必要があります。これは他のライブラリへの依存関係がないため、非常に簡単です。次のようにできます。
$ gcc transpose.c -o transpose
使用法
簡単なテキストファイルを簡単に処理できます。たとえば、
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
次のコマンドを使用してトランスポーズを実行できます。
$ transpose -t --fsep " " simple.txt
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
コマンドはtranspose
転置(-t
)であり、使用されるフィールド区切り文字は空白(--fsep " "
)です。
あなたの模範
サンプルデータは少し複雑な形式なので、2段階で処理する必要があります。まず、それをtranspose
処理できる形式に変換する必要があります。
このコマンドを実行すると、データはより水平にわかりやすい形式に変換されます。
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - -
title1 A1 title1 B1 title1 C1 title1 D1 title2 A2
title2 B2 title2 C2 title2 D2 title3 A3 title3 B3
title3 C3 title3 D3 title4 A4 title4 B4 title4 C4
title4 D4 title5 A5 title5 B5 title5 C5 title5 D5
これでtitle1、title2などの2番目の項目だけを削除できます。
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g'
title1 A1 B1 C1 D1 A2
title2 B2 C2 D2 A3 B3
title3 C3 D3 A4 B4 C4
title4 D4 A5 B5 C5 D5
transpose
今は処理可能な形式です。次のコマンドは完全な転置を完了します。
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g' \
| transpose -t --fsep " "
title1 title2 title3 title4
A1 B2 C3 D4
B1 C2 D3 A5
C1 D2 A4 B5
D1 A3 B4 C5
A2 B3 C4 D5
答え3
ファイルを目的の形式に変換する簡単な方法は次のとおりです。
$ grep -Ev "^$|title5" sample.txt | sed 's/title[0-9]://g' | paste - - - -
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
列ヘッダーが必要な場合:
$ grep -Ev "^$|title5" sample.txt | sed 's/:.*//' | sort -u | tr '\n' '\t'; \
echo ""; \
grep -Ev "^$|title5" a | sed 's/title[0-9]://g' | paste - - - -
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
2番目のコマンドの仕組み
バナー印刷grep -Ev "^$|title5" sample.txt | sed 's/:.*//' | sort -u | tr '\n' '\t';
バナーの後ろにキャリッジリターンを追加
echo
データライン印刷
grep -Ev "^$|title5" a | sed 's/title[0-9]://g' | paste - - - -
答え4
GNUデータマッシュユーティリティ
apt install datamash
datamash transpose < yourfile
該当ホームページから抜粋、https://www.gnu.org/software/datamash/そして http://www.thelinuxrain.com/articles/transpose-rows-and-columns-3-methods