2016-12-19 46 views
0

我希望編寫一個簡短的bash腳本,該腳本使用awk來混洗三個文件的內容,並在第四行添加一些帶有文本的行。例如:使用awk整理文本文件

文件1:

one.0 
one.1 
one.2 
one.3 

文件2:

two.0 
two.1 
two.2 
two.3 

文件3:

three.0 
three.1 
three.2 
three.3 

希望的結果:

one.0 
two.0 
three.0 
sometext 
one.1 
two.1 
three.1 
sometext 
one.2 
two.2 
three.2 
sometext 
one.3 
two.3 
three.3 
sometext 

感謝您的幫助!

+0

你真正的意思是洗牌(重新排列成隨機順序)或做你的意思是合併?額外的文本來自哪裏 - 腳本是否應該生成隨機文本?文件是否總是具有完全相同的行數,如果不是,輸出應該是多少? –

+0

我認爲在玩卡牌遊戲中這叫做完美洗牌,但更合適的術語是交錯。 – karakfa

+0

謝謝你的澄清。當看到這個問題時,我一直在努力尋找什麼。如果有人知道確切的術語,那就太好了。完美洗牌?交錯?合併? – ericstevens26101

回答

1

這awk的代碼是會做你想要什麼:

awk 'f!=FILENAME{++idx;f=FILENAME}{a[idx][FNR]=$0} 
    END{rows=length(a[1]) 
    for(r=1;r<=rows;r++){ 
     for(i=1;i<=idx;i++) { 
      print a[i][r] 
     } 
     print "sometext" 
    } 
}' f1 f2 f3 
+0

這似乎是一個很好的解決方案。它似乎比上面提供的解決方案稍微複雜一些。效率對我所做的事情很重要。與上面的代碼相比,你能否快速評論這將會執行? – ericstevens26101

5
$ cat a 
a0 
a1 
a2 
a3 

$ cat b 
b0 
b1 
b2 
b3 

$ cat c 
c0 
c1 
c2 
c3 

$ paste -d '\n' a b c | awk '1; NR % 3 == 0 {print "some text"}' 
a0 
b0 
c0 
some text 
a1 
b1 
c1 
some text 
a2 
b2 
c2 
some text 
a3 
b3 
c3 
some text 
+0

聰明。也許一個變種可能是'paste ... | sed'3〜3asome text'' – karakfa

+0

這似乎是一個很好的解決方案。簡短有效。效率對我所做的事情很重要。你可以快速評論這將執行比較下面的代碼? – ericstevens26101

+0

ericstevens26101,最好的辦法是在足夠大的測試數據集上進行嘗試,以獲得有意義的時間結果,並查看每個環境在您的環境中的執行情況!並且一定要使用'sed'嘗試@karakfa非常優雅的替代方案,現在您也擁有了來自James Brown的所有awk替代方案。如果這些文件非常大,肯定會注意到肯特的解決方案將首先將所有內容都讀入內存。讓我們知道你發現了什麼! – jas

0

一個在AWK使用getline

$ awk 'BEGIN { 
      while((getline line < ARGV[i+1]) >0) { # read from file refering ARGV 
       i=++i%(ARGC-1);      # ARGV iteration 
       print line (i?"":"\nsome text")  # print line and "some text" when needed 
      } 
     }' f1 f2 f3 
one.0 
two.0 
three.0 
some text 
one.1 
two.1 
three.1 
some text 
one.2 
two.2 
three.2 
some text 
one.3 
two.3 
three.3 
some text