すべてのテキストファイルを1つのファイルにマージしようとしています。すべてのテキストファイルには1つの列と同じ数の行があります。私のデータファイル名はdata_1.txt、data_2.txt、data_3.txt、。 。 data_n.txt.ここで、nはマージするテキストファイルの数です。 1からnまで順番にマージしたいです。次のコードを試しましたが、目的の方法で機能しません。列の順序を維持しません。
私のサンプルデータは次のとおりです
data_1.txt
0.020085
0.0017361
0.77963
0.98659
0.33102
0.099835
0
0
0.073004
0.29978
data_2.txt
0.021407
0.0017191
0.82385
1.0449
0.34593
0.10535
0
0
0.078362
0.31509
data_3.txt
0.022706
0.0016876
0.85447
1.0922
0.35556
0.11063
0
0
0.083983
0.32536
希望の出力
組み合わせ.txt
0.020085 0.021407 0.022706
0.0017361 0.0017191 0.0016876
0.77963 0.82385 0.85447
0.98659 1.0449 1.0922
0.33102 0.34593 0.35556
0.099835 0.10535 0.11063
0 0 0
0 0 0
0.073004 0.078362 0.083983
0.29978 0.31509 0.32536
私の問題を解決するのに役立ちますか?
#!/bin/bash
paste data_*.txt > combined.txt
答え1
を使用すると、zsh
glob修飾子を使用してファイル名が生成される順序に影響を与えることができます。
paste file_*.txt(n)
開く予定です数字入れて並べ替えるfile_10.txt
後ろに file_9.txt
ファイルがCR文字(Microsoftの世界からインポートされたかのように)で終わると、その文字はターミナルに出力するとカーソルが最初の列に移動します。
したがって、埋め込みファイルの場合A\rB\rC\rn
(MS-DOS形式のファイルが3つある場合に発生paste
)、上記の内容をパイピングしてCR文字を削除できますcat that-file
。C
tr -d '\r'
答え2
あなたはそれを使用することができます支柱の拡張力paste
の整列:
$ paste data_{1..3}.txt
0.020085 0.021407 0.022706
0.0017361 0.0017191 0.0016876
中かっこは複数の単語に展開され、各単語には中かっこの左右の部分があります。構文は次のとおりn..m
です。配列表現:
シーケンス式は {x..y[..incr]} 形式を取ります。ここで、xとyは整数または単一文字で、incr(オプションの増分)は整数です。整数が指定されると、式はxとyの間のすべての数字を含む拡張されます。
上記のコマンドラインは次のように展開されます。
paste data_1.txt data_2.txt data_3.txt
これには正しい順序のファイルが含まれます。3
これを必要な数のファイルに変更して、適切なファイル名をすべて取得できます。
このpaste
コマンドは、ファイルパラメータを引数として指定された順序で列単位で連結するため、引数の順序が重要です。 filenames を使用すると、*
ファイル名がアルファベット順に拡張されます。これは、10個以上のファイルがある場合は間違っているため、列の順序が間違っています。 1~9個のファイルの場合はどちらでも大丈夫です。
答え3
paste -d " " 1.txt 2.txt > 4.txt
それを使用する別の方法がありますawk
:
$ awk '{printf "%s",$1; getline < "1.txt" ; printf " %s\n",$1}' 2.txt