切り取りと貼り付けシェルコマンドを使用してテーブルのx軸とy軸を置き換える方法

切り取りと貼り付けシェルコマンドを使用してテーブルのx軸とy軸を置き換える方法

450.000×15.000タブで区切られたフィールドファイルのx軸とy軸を転置する必要があるため、まずA.txtという小さな5×4テストファイルを試しました。

x   column1 column2 column3

row1    0   1   2

row2    3   4   5

row3    6   7   8

row4    9   10  11

私はこれを試しました:

for i in {1..4}; do cut -f"$i" A.txt | paste -s; done > At.txt

しかし、正しく動作しません。

出力は次のとおりです

X   row1    row2    row3    row4
column1 0   3   6   9
column2 1   4   7   10
column3
    2
    5
    8
    11

答え1

入力がタブ区切りのフィールドを持つUnixテキストファイルであり、pasteGNUを使用すると仮定すると、コマンドは正常に機能します。 GNU以外のシステムでは、次のものを使用する必要があります。

$ for i in {1..4}; do cut -f"$i" A.txt | paste -s - ; done
x       row1    row2    row3    row4
column1 0       3       6       9
column2 1       4       7       10
column3 2       5       8       11

-標準入力から読み取るように指示する引数に注意してください。paste

君は必ずこうするんだいいえファイルを450,000回読み取る必要があるため、450,000列で実行しようとしています。他のソリューションを使用することをお勧めします。

たとえば、行と列を置き換える」。


上記のコマンドをDOSテキストファイルで実行すると、端末に次のような出力が生成されます。

x       row1    row2    row3    row4
column1 0       3       6       9
column2 1       4       7       10
        11

出力を新しいファイルにリダイレクトし、vimエディタでファイルを開くと、次のようになります。

x   row1    row2    row3    row4
column1 0   3   6   9
column2 1   4   7   10
column3^M   2^M 5^M 8^M 11^M

これらのそれぞれは、^Mキャリッジリターン文字(DOSテキスト行の末尾にある追加の文字)です。これらのキャリッジリターンはカーソルを行の先頭に戻すので、端末の最後の行に表示される唯一の項目はタブ文字と11(他の列を上書きする)ことです。

を実行して、入力ファイルがUnixテキストファイルであることを確認してくださいdos2unix A.txt

答え2

CygwinはGnu環境です。問題は、行末がMS-Windowsの用量行末が異なることです。まず、dos2unixを介してファイルを渡します(テキストファイルに対してのみこれを行います)。

今再印刷しました。od -ta私の端末はdos cmdとは異なる方法でレンダリングしているので、これをパイプしています(cmdはキャリッジリターンを改行に変更します)。

#unix2dos A.txt
#for i in {1..4}; do cut -f"$i" A.txt | paste -s; done | od -ta
0000000   x  ht   r   o   w   1  ht   r   o   w   2  ht   r   o   w   3
0000020  ht   r   o   w   4  nl   c   o   l   u   m   n   1  ht   0  ht
0000040   3  ht   6  ht   9  nl   c   o   l   u   m   n   2  ht   1  ht
0000060   4  ht   7  ht   1   0  nl   c   o   l   u   m   n   3  cr  ht
0000100   2  cr  ht   5  cr  ht   8  cr  ht   1   1  cr  nl

説明:cutキャリッジ戻り文字を最後のフィールドの一部として扱います。改行文字はレコード区切り記号です。

関連情報