行と列を置き換える

行と列を置き換える

次の行を含むファイルがあります。

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

関連情報