2014-12-02 52 views
1

我想提取由空格分隔的相鄰單詞的所有可能組合 - 一個,兩個,三個項目。也就是說,轉換這一行:如何從一行中提取一個/兩個/三個相鄰的單詞?

a bc de fghi j 

a 
bc 
de 
fghi 
j 
a bc 
bc de 
de fghi 
fghi j 
a bc de 
bc de fghi 
de fghi j 

如何使用awk儘可能快地做到這一點?我完全陷入困境,不知道。我想到了像match($0, /^([a-z]+)$|([^\s]+\s[^\s]+)|([^\s]+\s[^\s]+\s[^\s]+)/, arr)這樣的東西,但在這種情況下無法工作。

編輯 基本問題是如何結合使用split。例如,

{split($0, arr, ","); 
for (i = 1; i <= length(arr); i++) { 
    print arr[i] 
} 
for (i = 1; i <= length(arr) - 1; i++) { 
    print arr[i] " " arr(i+1) 
} 
for (i = 1; i <= length(arr) - 2; i++) { 
    print arr[i] " " arr[i+1] " " arr[i+2] 
} 
} 

Call to undefined function

+0

。有很多方法可以做到這一點。這取決於你製作的邏輯。 提示:使用數組 – 2014-12-02 07:50:58

+0

第6行有錯字。將'arr(i + 1)'更改爲'arr [i + 1]'。 – merlin2011 2014-12-02 08:43:35

+0

呃,那太急了!謝謝 – 2014-12-02 08:55:37

回答

1

這是一個有點冗長awk腳本,將基於您所提供的輸入輸出。

{ 
for (i = 1; i <= NF; i++) { 
    print $i 
} 
for (i = 1; i <= NF - 1; i++) { 
    print $i " " $(i+1) 
} 
for (i = 1; i <= NF - 2; i++) { 
    print $i " " $(i+1) " " $(i+2) 
} 
} 

運行這樣的:

awk -f Extract.awk Input.txt 

這裏是一個爲k > 3相鄰字的作品更廣泛的版本。

function join(array, start, end, sep, result, i) 
{ 
    if (sep == "") 
     sep = " " 
    else if (sep == SUBSEP) # magic value 
     sep = "" 
    result = array[start] 
    for (i = start + 1; i <= end; i++) 
     result = result sep array[i] 
    return result 
} 

{ 
for (i = 1; i <= NF; i++) { 
    a[i] = $i  
} 
for (k = 0; k < 3; k++) { 
for (i = 1; i <= NF - k; i++) { 
    result = join(a, i, i + k, " ") 
    print result 
} 
} 
} 
+0

如果我打算使用'split(str,arr,sep)',我可以用'length(arr)'和'arr [i]'替換'NF'和'$ i'嗎? – 2014-12-02 08:13:32

+0

@lyricallyevil我不明白爲什麼不,但知道的唯一真正的方法是嘗試它:) – merlin2011 2014-12-02 08:19:12

+0

請檢查更新。你可以編輯你的答案,假設'$ 0 = split($ 0,arr,sep)'? – 2014-12-02 08:34:39

1

您可以使用使用前瞻此perl的命令:右爲腳本

s='a bc de fghi j' 
perl -ne 'print join "\n" =>$_ =~ /(?=\b(\w+)\b)/g; print "\n"; 
      print join "\n" =>$_ =~ /(?=\b(\w+\s+\w+)\b)/g; print "\n"; 
      print join "\n" =>$_ =~ /(?=\b(\w+\s+\w+\s+\w+)\b)/g; print "\n"' <<< "$s" 
a 
bc 
de 
fghi 
j 
a bc 
bc de 
de fghi 
fghi j 
a bc de 
bc de fghi 
de fghi j 
+1

不錯......在這種情況下,可以使用一個普通的逗號來代替'=>' – 2014-12-02 10:22:39

+0

在上面的命令中,逗號也可以代替'=>'。 – anubhava 2014-12-02 10:40:26

相關問題