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テキストファイルであり、paste
GNUを使用すると仮定すると、コマンドは正常に機能します。 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
キャリッジ戻り文字を最後のフィールドの一部として扱います。改行文字はレコード区切り記号です。