2012-08-27 8 views
5

私は参加したい2つのcsv/textファイルを持っています。両方とも同じ第1行を含む。私は、sedとcatを使ってマージされたファイルを生成する方法を理解しようとしていますが、最初の行は1つしかコピーされていません。そして私は文法を持っている時間があります。どんな助けも大いに評価されるでしょう:-D! おかげで、 アンドリューFile1 +(File2 - 1行目)> File3

答えて

4

これは、data2.txtからの最初の行をスキップし、ファイルmerged.txt内のファイルdata1.txtdata2.txtを結合します。あなたはそれでOKであればそれはawkを使用しています:

(cat data1.txt; awk 'NR>1' data2.txt) > merged.txt 

awkはファイルdata2.txtから行番号> 1を持つすべての行がmerged.txtをファイルに追加します。

NRは、処理中のファイルの現在の行番号を表す組み込みのawk変数です。ブール式NR > 1が真の場合、awkはその行を暗黙的に出力します。あなたはdata1.txtそのまま維持を気にしなかった場合は

、あなたは自分の第二のファイル(マイナスの最初の行)を追加し、減らすことができるだけでこれに:

awk 'NR>1' data2.txt >> data1.txt 
+2

また、 'awk 'の代わりに' tail -n + 2'を使用することもできます。 –

+0

@ TannerL.Swettきちんと頭を使うか頭を使っているかを考えていましたが、私はawkでこれをどうやって行うのか確信していました。もちろん、OPが 'data1.txt'を保存することに気をつかない場合は、最初のコマンドをスキップして2番目のファイル(最初の行)をそのファイルに追加することができます。 – Levon

4

awkを持つ別のオプション:

awk 'NR==FNR || FNR>1' file1.txt file2.txt .. fileN.txt 

これは、最初のファイルのすべての行、または後続のファイルの最初の行の後の行を表示します。 1行 「1つのD」で解決

+0

これを行うとどうなるでしょう: 'awk 'NR == FNR || FNR> 1 '* .txt' –

+0

ファイルグロブに一致したファイルの順序に依存します。それらがすべて同じ最初の行を含んでいれば、これは安全であるはずです。なぜそれを試してみて、何が起こるか見てみませんか? – ghoti

1

はFILE2

で次のコマンドを最初の行を削除することを意味し、私が最も簡単な解決策があると言うだろう

sed '1 d' file2 >> file1 
+0

あなたはこのコマンドで 'file1'と' file2'の両方を修正しています - これはOPでOKかもしれません。どちらのオプションも元のファイルを変更しない方が良いでしょう。 – Levon

+0

@ Levon:いいえ、あなたはここで 'file2'を修正していません。 – tripleee

+0

@tripleeeちょうどそれをテストした、それは*削除*ではなく、*表示していない*最初の行..それを持っています。しかし、おそらく答えでより良い表現することができます。 – Levon

2

ををfile1した結果を追加します:

(cat file1.txt ; tail -n +2 file2.txt) > file3.txt 

それはあなたがやっているだけで何明確に述べるの利点があります:すべてが、SEの最初の行を印刷し、その後、全体の最初のファイルを印刷condファイルを使用して、3番目のファイルに出力を書き込みます。

+0

うわー!!!みんな、ありがとう!!!!!!! :-D –

関連する問題