2016-03-28 100 views
4

我有兩個文件,我試圖從file2插入一行到file1,每隔4行從file1的開始處開始。因此,例如:shell每隔n行插入一行

文件1:

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

文件2:

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號線相匹配的條件 - 從「文件2」,並將其存儲在變量this
  • 得到一個線print this - 打印...這個。
  • 1 - 簡寫爲「打印當前行」,在這種情況下,來自文件1(AWK的正常輸入)
+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時,我們使用模算術檢查當前記錄#是否可被4整除,然後是否從file2插入一行並增加索引計數器。我們打印file1的行。
-1

下面是與pastetr

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

做一個愚蠢的方法假設您的輸入文件中沒有任何實際的選項卡。

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 - - - -