2016-03-28 21 views
4

私は2つのファイルを持っていますが、file1の先頭から1行おきにfile2にfile2の行を挿入しようとしています。ですから、例えば:シェルはn行ごとに行を挿入します

FILE1:

line 1 
line 2 
line 3 
line 4 
line 5 
line 6 
line 7 
line 8 
line 9 
line 10 

FILE2:

50 
43 
21 

私が取得しようとしています出力:

50 
line 1 
line 2 
line 3 
line 4 
43 
line 5 
line 6 
line 7 
line 8 
21 
line 9 
line 10 

私が持っているコード:

while read line 
do 
    sed '0~4 s/$/$line/g' <file1.txt> file2.txt 
done < file1.txt 

私は、次のエラーを取得しています:

sed: 1: "0~4 s/$/$line/g": invalid command code ~ 
+0

をファイル。この場合file1 – jeabesli

+0

'file1'のサンプルデータも表示できますか? – anubhava

+1

ファイルが混在しているので質問を編集しました – jeabesli

答えて

2

メモリ内の配列にいずれかをロードしない両方のファイルを通じて、以下のステップ:

awk '(NR-1)%4==0{getline this<"file2";print this} 1' file1 

実際file2は、あなたがメモリ内に保持するために欲しいものよりも大きい場合、これは望ましいかもしれません。

次のようにこれが故障:

  • (NR-1)%4==0 - 0
  • getline this<"file2"で始まるすべての4番目の行と一致する条件 - 「FILE2」から行を取得し、変数this
  • に保存しますprint this - これを印刷します。
  • 1から
+0

ありがとう – jeabesli

2

awkを使用して、これを行うために緩和されています

awk 'FNR==NR{a[i++]=$0; next} !((FNR-1) % 4){print a[j++]} 1' file2 file1 

50 
line 1 
line 2 
line 3 
line 4 
43 
line 5 
line 6 
line 7 
line 8 
21 
line 9 
line 10 
  • file2すなわち、入力の最初のファイルを処理している間、我々は持つ配列内の各ラインを保存しますキーを0で始まるインクリメント番号に変更します。
  • 入力にfile1の2番目のファイルを処理している間に、モジュロ演算を使用して現在のレコード番号を4で割り切れるかどうかを確認し、file2から行を挿入してインデックスカウンタをインクリメントします。
  • 最後に、アクション1を使用して、file1の行を印刷します。
-1

はここpastetr

paste file2 <(paste - - - - <file1) | tr '\t' '\n' 

でそれを行うには間抜けな方法です。この場合、FILE1から来て、(AWKの通常の入力)「現在の行を印刷する」の省略形入力ファイルに実際のタブがないと仮定します。

1

別の代替のUNIXツールチェーン

$ paste file2 <(pr -4ats file1) | tr '\t' '\n' 

50 
line 1 
line 2 
line 3 
line 4 
43 
line 5 
line 6 
line 7 
line 8 
21 
line 9 
line 10 
2

でこれは(GNUのSED)あなたのために働くかもしれない:

sed -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' file2 

または単に猫とペーストを使用します。他からの読み取り

cat file1 | paste -d\\n file2 - - - - 
関連する問題