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
。