2017-07-27 23 views
1

問題的第一部分有很多答案,即在兩個圖案之間打印線條。例如:在兩個圖案之間打印線條並休眠一秒鐘然後重複至EOF

awk '/start/{flag=1} flag; /end/{flag=0}' file 

此打印出圖案的「開始」和「文件」內發生幾次「端」之間的界線。假設該文件包含:

start a b c d 4 5 3 7 8 end some garbage start 6 d 0 0 1 d g end other garbages start 6 5 ... end some other garbage 

上述「AWK」命令打印出整個文件消除了垃圾..這是很好的,但我要的是每個這樣的塊之間的停頓。即打印

start a b c d 4 5 3 7 8 end

睡眠用於第二(sleep 1可以使用),然後打印下一個塊:

start 6 d 0 0 1 d g end 

等等直到文件的末尾。我廣泛搜索,但無法找到第二個「暫停/等待」部分,因此我相信這不是一個重複的問題。

+1

你確定awk腳本正在做你所說的事嗎? – JNevill

+1

爲了說明問題,在給定示例數據的情況下,它不適用於我,並且如果沒有for循環迭代記錄中的字段,我無法看到它是如何工作的。如果執行for循環,那麼在循環啓動到下一個字段之前,可以在'/ END /'測試中實現'system(「sleep 10」)''。但這是一個有爭議的問題,因爲劇本似乎沒有做到應有的功能。 – JNevill

+0

@JNevill其實你是對的,它打印出整個文件。但無論如何,我對awk命令不感興趣,這只是一個例子。我想在問題中描述的內容。 – quanta

回答

1

隨着GNU AWK多焦RS:

$ cat tst.awk 
BEGIN { RS="[[:space:]]+"; ORS=" " } 
/start/ { found=1 } 
found { print } 
/end/ { printf "\n"; found=0; system("sleep 1") } 

$ time awk -f tst.awk file 
start a b c d 4 5 3 7 8 end 
start 6 d 0 0 1 d g end 
start 6 5 ... end 

real 0m3.214s 
user 0m0.015s 
sys  0m0.122s 

注意變量名稱應該是found或類似意義的詞,不是flag作爲一個標誌是它是什麼類型的變量,而不是什麼代表。命名一個標誌變量flag就像命名你的整數變量integer而不是countsum或其他有意義的東西。

+0

嗨,它仍然打印出一切!我想要一些符合這兩種模式(開始和結束)的東西,並打印出一個這樣的塊並暫停一秒鐘,然後找到下一個塊等。 – quanta

+0

不,它確實如此,它確實顯示了它在做什麼我的答案。如果您有不同的體驗,那麼您的實際輸入與您發佈的輸入不符,或者您沒有使用gawk。 –

1

替代使用system("sleep 1")EdMorton所建議將管AWK的輸出轉換成一個bash while循環:

awk ... | while read -r line ; do 
    echo "${line}" 
    sleep 1 
done 

這將避免產卵每個睡眠操作的額外的外殼。

+0

我沒有看到在任何地方使用的模式「開始」和「結束」,但至少它打印出單行,所以它對我很有用,儘管我發現了另一個與你非常相似的解決方案:'#!/ bin/bash當IFS =''讀取-r行||時,爲 [[-n「$ line」]];做 回聲「$ line」 sleep 1 done <「$ 1」'非常感謝。 – quanta

+0

我的意思是,使用EdMorten的awk腳本,從它中刪除'system(「sleep 1」)'並將它傳遞給while循環。但這只是一個非常小的優化。 EdMorten的回答應該適合你。 – hek2mgl

相關問題