web-dev-qa-db-ja.com

2つのテキストファイルから行をインターリーブする方法

2つ(またはそれ以上)のテキストファイルの行をインターリーブする最も簡単で迅速な方法は何ですか?例:

ファイル1:

line1.1
line1.2
line1.3

ファイル2:

line2.1
line2.2
line2.3

インターリーブ:

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

両方を開き、タスクを実行する小さなPerlスクリプトを書くのは簡単です。しかし、より少ないコード、おそらくUnixツールを使用するワンライナーで逃げることが可能かどうか疑問に思っていましたか?

73
Frank
paste -d '\n' file1 file2
134
codaddict

awkを使用したソリューションは次のとおりです。

awk '{print; if(getline < "file2") print}' file1

この出力を生成します:

line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc

awkを使用すると、出力に追加の書式設定を追加する場合に便利です。たとえば、各行のファイルに基づいて各行にラベルを付ける場合:

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1

この出力を生成します:

1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc

注:このコードは、file1がfile2以上の長さであると想定しています。

File1にfile2よりも多くの行が含まれ、file2の終了後にfile2の空白行を出力する場合は、getlineテストにelse句を追加します。

awk '{print; if(getline < "file2") print; else print ""}' file1

または

awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1
6
samgak

@ Sujoy's answer 有用な方向を指し示します。行番号を追加、ソート、および行番号を削除できます。

(cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-

注(私にとって興味深い)これは、静的ファイルの代わりに、互いに遅くまたは速く実行されるコマンドの出力を使用する場合、順序を正しくするためにもう少し作業が必要です。その場合、行番号に加えて別のタグを追加/ソート/削除する必要があります。

(cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' )  \
   | sort -n  | cut -f2- | sort -n | cut -f2-
2
Joshua Goldberg

GUIを使用して、スプレッドシートの2つの列に貼り付け、すべてのセルをコピーしてから、正規表現を使用してタブを改行に置き換えます。

1
Dwedit