2017-05-27 41 views
0

話我想的是加入單獨的單詞的AWK命令:AWK:加入單獨的從連續2行

第一部分是在該行的末尾,以「_」結束。

第二部分是下一行的開頭。

(PS:有一些線具有兩個第二和第一部分象在下面的示例)

實施例:

Bla bla bla bla SATU_ 
RDAY bla bla, bla bla 
bla bla bla bla bla SUN_ 
DAY: bla bla bla bla M_ 
ONDAY. Bla bla bla bla TU_ 
ESDAY, bla bla bla. 

結果:

Line 1: SATURDAY 
Line 3: SUNDAY 
Line 4: MONDAY 
Line 5: TUESDAY 

回答

2
$ awk 'p~/_$/{sub(/_$/,"",p);print "Line " (NR-1) ":", p $1}{p=$NF}' file 
Line 1: SATURDAY 
Line 3: SUNDAY: 
Line 4: MONDAY. 
Line 5: TUESDAY, 
+1

這是習慣性的評論當downvoting。 –

+1

downvote年齡!我甚至埃德也被低估了! –

+0

++爲優雅的解決方案,但刪除尾標點缺失。另一方面:所有的反對票同時發生,表明一個單選者。 – mklement0

0

不太清楚你所有的要求,但是:

awk 'x {sub("[^A-Z].*", "", $1); print "Line "n": "x $1; x = ""} 
    sub("_$", "", $NF) {x = x $NF; n = NF}' input.txt 

HTH

0

隨着GNU AWK:

$ awk 'p{print gensub(/[^A-Z]$/,"","g",$1);p=0}/_$/{printf "%s",gensub("_","","g",$NF);p=1}' file 
SATURDAY 
SUNDAY 
MONDAY 
TUESDAY 
+1

@EdMorton好吧,埃德 - 注意。 –

+0

沒有評論的下調是我最喜歡的情況。 –

+0

大聲笑,所有的人都被壓低了。 :D(只是要清楚:只有一個沒有被低估的時間並不在其附近) –

1

隨着GNU AWK用於多炭RS:

$ awk -v RS='[[:alpha:]]+_\n[[:alpha:]]+' 'RT!=""{sub(/_\n/,"",RT); print RT}' file 
SATURDAY 
SUNDAY 
MONDAY 
TUESDAY 

或與任何AWK:

$ awk 'w{w=w $1; gsub(/[^[:alpha:]]/,"",w); print w; w=""} /_$/{w=$NF}' file 
SATURDAY 
SUNDAY 
MONDAY 
TUESDAY 

和如果你真的想在起跑線號POSIX兼容的

$ awk 'w{w=w $1; gsub(/[^[:alpha:]]/,"",w); printf "Line %d: %s\n", NR-1, w; w=""} /_$/{w=$NF}' file 
Line 1: SATURDAY 
Line 3: SUNDAY 
Line 4: MONDAY 
Line 5: TUESDAY 
0

:A液:用任何AWK包括然後

awk ' 
    firstPart != "" { sub(/[[:punct:]]$/, "", $1); print firstPart $1 } 
    $NF ~ /._$/ { firstPart=substr($NF, 1, length($NF) - 1); next } 
    { firstPart= "" } 
' file 
  • 模式(條件)firstPart != ""只有感興趣的令牌上以前發現的是真實的線,然後才執行相關動作{ ... }):

    • sub(/[[:punct:]]$/, "", $1)內容替換(sub())尾部($)一個標點符號字符([[:punct:]])的情況下,如果有的話,在所述第一場($1)與空字符串,從而有效地除去它。

    • print firstPart $1簡單地通過將firstPart$1彼此相鄰,僅由空格分隔打印的從與所述(經修飾的)第一場,前一行感興趣的令牌的直接串聯。

  • 模式$NF ~ /._$/測試,如果最後一個字段($NF)在($_結束(由其它至少1個字符(前面.))。

    • firstPart=substr($NF, 1, length($NF) - 1)存儲最後字段的內容,除了在可變firstPart尾隨_
    • next跳過處理腳本剩餘部分的腳本並移動到下一行。
  • 行動{ firstPart= "" },因爲它不是由一個模式之前,無條件處理 - 如果達到

    • 這裏,如果手頭的行包含任何利益令牌是隻達到。
    • 重置firstPart信號到下一個腳本週期,下一行沒有內容可打印。