2016-08-20 66 views
0

如何將'number:number'的所有文本放到與前面的'number:number'相同的行上?sed/awk - 將所有文本放在與前面的數字相同的行上

10:15 
text line one 
text line two 
text no pattern 

11:12 
random text 
text is random 
totally random 
could be four lines 
could be five 

應該再成爲

10:15 text line one text line two text no pattern 
11:12 random text text is random totally random could be four lines could be five 
+0

文本是否會有任何數字? – VM17

+0

不,它只會是文本或東西線逗號和停止 – user1776732

+0

讓我知道我的答案是否適合你。 – VM17

回答

2

這適用於您的示例 -

tr '\n' ' ' < file.txt | sed 's/[0-9]*:[0-9]*/\n&/g' 

Explanation-

TR將首先把一切都放在同一行。

然後,sed一個班輪將在每個num:num模式之前插入新行。

+0

由於不可移植的使用'\ n',只能在某些seds下工作,會在不包含數字的':'之前插入換行符,並且會在輸出開頭插入不需要的換行符。 –

0

下面是一個GNU AWK腳本:

script.awk

BEGIN { RS = "\n[0-9]+:[0-9]+|\n$" } 
     { gsub(/\n/,"",$0) 
     printf("%s%s ", $0,RT) } 

使用方法如下awk -f script.awk file.txt

它使用了GNU AWK特定擴展RT和正則表達式RS

  • 記錄分隔符設置爲「冒號分隔數字對」。
  • 爲了在文件末尾獲得最後的換行符,添加了「| \ n $」以匹配文件中的最後一個換行符。
  • 爲了從第二對開始分離:在前面添加「\ n」。因此,第一個結腸分隔號碼對「10:15」包含在第一個$0中,而不是在RT中。
0

這裏的訣竅是你想分段而不是行的文件。在awk中,如果你設置RS =「」它啓用段落模式。 awk循環的每個迭代將有一個$ 0的段落。然後,您可以替換換行符並將它們變成空格。

awk <data.txt 'BEGIN { RS = "" ; FS = "\n" } { gsub(/\n/, " ", $0) ; print }' 

輸出:

10:15 text line one text line two text no pattern 
11:12 random text text is random totally random could be four lines could be five 

這樣做的好處是,AWK處理所有爲你的特殊情況:在一個空行結尾的文件,最終沒有一個空行,最終沒有一個換行符,等等

1

兩個sed和直到檢測到新的記錄或輸入完成在這種情況下,接合線被印刷並清除AWK溶液加入線 - 使用任一溶液

sed的oneliner

sed -nr '/^[0-9]{2}:[0-9]{2}$/!{H;$!b}; x; s/\n/ /gp' 

的awk腳本

awk ' 
!/^[0-9]{2}:[0-9]{2}$/ { 
    lines=lines" "$0 
    next 
} 
{if(lines) print lines; lines=$0} 
END {print lines} 
' 
2

既然你需要輸入文件中的所有就是告訴AWK使用RS=<null>讀取一次一個空行分隔段落和使用默認值OFS重新編譯每條記錄

$ awk -v RS= '{$1=$1}1' file 
10:15 text line one text line two text no pattern 
11:12 random text text is random totally random could be four lines could be five 
+1

這個答案雖然有效,卻完全忽略了使用num:num模式作爲顯着特徵的地步。如果你使用這種模式作爲生成休息的方式,會更好。 – VM17

+0

這就好比說當有人問他們如何在牙刷旁邊使用牙刷挖洞時,應該告訴他們如何用牙刷代替鏟子。提問的人不知道正確的做事方式,或者他們不會問。他們從正確的方法而不是錯誤的方面受益更多。 –

相關問題