2017-02-12 78 views
0

我想從File2將文本粘貼到File1在任何情況下如何將文本插入空行?

文件1:

1 
2 

4 
5 

7 
8 

文件2:

3 
6 

輸出:從這個問題

1 
2 
3 
4 
5 
6 
7 
8 

作爲例子嘗試Insert text into blank lines in bash

sed -e '/^$/{R file2' -e 'd}' file1 

但它只有在有隻有每秒線空白的工作,以防萬一。我想問,在更復雜的情況下是可能的?換句話說,是否有一個通用的解決方案?

作爲例子:

文件1

1 
2 
3 

5 
6 


9 

文件2

4 
7 
8 

輸出

1 
2 
3 
4 
5 
6 
7 
8 
9 
+2

使用GNU sed的sed腳本,工作正常,我在第二個例子中,注意不要讓'File1'和'File2'後以單行換行結束。例如:小心點擊「8」和「9」後的返回。 –

+0

通過「通用解決方案」,你的意思是1)取兩個文件,2)組合,3)分類4)消除空白?你可以做'cat f1 f2 |排序| grep。# – dawg

回答

3

你可以試試這個awk腳本:

script.awk

FNR == NR { repl[ ++i ] = $0; next; } 
NF == 0 { print repl[ ++j ]; next; } 
1 

像這樣運行它:awk -f script.awk File2 File1

說明

  • 在讀取給定爲參數的第一文件與條件FNR == NR第一行時才執行。這裏是File2。它將替換行存儲在repl中,並由於next聲明而從File2中讀取下一行。
  • 第二行和第三行鍼對作爲參數給出的第二個文件執行,這裏是File1
    • 條件NF == 0爲空行真並打印從repl下一個可用的替代路線,然後讀取來自File1
    • 1excuted用於非空行從File1下一行,這是一個快捷方式用於打印生產線。
+1

@EdMorton我更新了腳本,感謝您的建議。 –

1

容易無論如何Perl的一個lnier

如果您改變file_2成一個文件,而無需換行符這是一個輕而易舉的事。

enter image description here


$ cat file_1 
1 
2 
3 

5 
6 


9 
$ cat file_2 
3 7 8 
$ 
$ perl -ale '@[email protected] if $.==1; print (/\d+/ ? @F : shift @file2) if $.!= 1' file_2 file_1 
1 
2 
3 
3 
5 
6 
7 
8 
9 

它是如何工作

主要部分是在這裏:
print (/\d+/ ? @F : shift @file2)
使其彈出的文件2如果該行不匹配任何數字。這就對了。
您也可以改變@F$ _
print (/\d+/ ? $_ : shift @file2)

2

這裏有一個用awk和getline

$ awk 'NF==0{ getline < "file2" }1' file1 
1 
2 
3 
4 
5 
6 
7 
8 

9 

額外的空行是在file1因爲有更多的空白測試是file2中的值。

+0

這可能是getline的一個很好的用法。 '!NF'會變短。 – karakfa

0

何不索性填數組,然後打印出所提供的指標:

awk 'NF{a[$1]}END{for(i in a)print i}' file1 file2 
+0

,因爲它不會以讀取/期望的順序打印值,它將以隨機(散列)順序打印這兩個文件中的值。你可能只需要'awk'NF'file1 file2'。 –

+0

不......您的解決方案將按它們在文件中出現的順序打印它們。礦將按數字順序顯示它們。 – grail

+0

不,不會,你可以在https://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array上閱讀有關'in'的操作符:''數組被這個語句訪問是由awk'中的數組元素的內部排列決定的。換句話說,它們被訪問的順序是它們被存儲在散列表中的順序,對於你可以考慮的所有意圖是隨機的。 –

相關問題