2つのファイルの代替行をマージする


9

ファイル1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

ファイル2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

出力ファイル:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
してくださいいつでもお使いのオペレーティングシステムに言及。標準ツールの多くはOSによって動作が異なるため、使用しているものを知る必要があります。
terdon

回答:




5

このpasteソリューションは、最もポータブルで最も効率的です。2つのファイルの行数が同じでない場合の動作を好む場合にのみ、この代替案について言及します。

GNUの場合sed

sed Rfile1 file2

file1行数が未満の場合file2file1が使い果たされると、sed何も出力されません(の空行とは対照的paste)。

場合file1よりも多くの行があるfile2(のために空行を印刷するとは対照的に、それらの余分な行が破棄されます、file2としますpaste)。

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

使用してawkgawknawkmawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}NR==FNR現在のレコード番号が現在のファイルレコード番号と等しい場合にのみ一致します(したがって、最初のファイルの処理中にのみ一致します):現在処理中のレコードをx現在のファイルレコード番号と等しいインデックスの配列に格納し、現在の記録
  • {print x[FNR]"\n"$0}:配列の内容xを、現在のファイルのレコード番号の後に改行が続き、現在のレコードの内容が続くインデックスに出力します
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

それは出力を与えていますが、私が望んでいたものとまったく同じではありません。tid.info行が出力ファイルのtid.setnr行の後に来ます。
pmaipmui

@Nainitaこれは、出力例に表示されているものです。
2015年

@Nainitaとにかく出力の順序を切り替えるfile1file2は、コマンドで切り替えるだけです。
2015年

はい...私は同じことをしましたが、以前とまったく同じように印刷していました。tid.setnrを出力すると、tid.infoが表示されました。
pmaipmui

1
@mikeservしかし、私はそこにいたので、私mawkも試してみましたが、それでも動作します。とにかく、私はそれが動作しない理由を見ることができない合理的なものだけで(つまり、他の方法で回避するだけでファイルを切り替えることによって)。awk入力を気にする必要はありません。行は行です。何かが彼のバージョンでサポートされていなかったとしたら、それは初めて壊れただけでしょう。もっと簡単に言えば、OPが引数の入力ファイルの切り替えを間違えただけです。
2015年

-1

最も簡単な解決策を以下に示します。

cat file1 >> file2

または

cat file2 >> file1

1
サチン、もう一度質問を読んでください。これにより、あるファイルのコンテンツが別のファイルのコンテンツに追加されます。ファイルを行file1file2
ごとに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.