2017-03-31 92 views
-1

我有這樣的一個領域兩個部分組成:AWK - 如何打印一個記錄

Dagmar Schlecht(ID: 1233), Taubenstr- 246, 71108 Germany, [email protected] 1233 Shopping cart #3664 - Grüne Pillen; 

我怎麼能打印的字符,直到第一個「)」出現在,例如,$ 1和字符〜 /「購物」和19個字符以上(所以部分「 - GrünePillen」正在被跳過)?

結果應寫入新字段,例如$ 2:

Dagmar Schlecht(ID: 1233) Shopping cart #3664 
+0

閱讀[問],您的問題越來越嚴重。 –

回答

1

如果您沒有問題sed

sed -r 's/(^[^,]+).*(Shopping cart[^-]+)(.*)/\1 \2/' inputfile 
Dagmar Schlecht(ID: 1233) Shopping cart #3664 

這裏,backrefrencing用於分隔記錄成多個數據塊,然後再使用\N簡稱。每組定義爲()

相同的正則表達式可以與gawk一起使用,使用match函數支持thired參數。

awk '{match($0,/(^[^,]+).*(Shopping cart[^-]+)(.*)/,a);print a[1],a[2]}' 
Dagmar Schlecht(ID: 1233) Shopping cart #3664 
+0

恩,謝謝你的代碼和參考。兩者都遠遠落後於我的理解。在我的情況下,這是行不通的,因爲我在我的輸入中使用了德語Umlaute。至少這個錯誤信息似乎告訴了我。此外,這是一個便攜式的願望?我寫了「如何才能打印字符,直到第一個」)出現在例如$ 1「中。我的awk腳本是這樣的:regexfind {各種指令,打印}。我需要在這個regexfind {environement}中劃分和重建記錄 - 抱歉,我沒有初步說清楚,因爲我認爲這沒有必要。謝謝PS。 – prestalearner

+0

對不起!我錯誤地使用了「記錄」一詞,因爲我認爲我讀過這些字段也被稱爲記錄。但是記錄可以這麼說。無論如何,我需要在一個字段中「斷開」一個字符串,例如1美元或永遠。 – prestalearner

+0

@prestalearner記錄包含一行或多行,行包含一個或多個字段。 –

0

有可能是在awk來做到這一點更漂亮的方式,但是這很好地做這項工作:

awk -F"[ ,]" '{cartFound=0; printf "%s %s %s", $1, $2, $3; for (i=4;i<=NF;++i){if($i=="Shopping"){cartFound=1} if(cartFound==1){ printf " %s", $i} if($i ~ /^#/){cartFound=0}}}{printf "\n"}' inputFile 

這裏我們:

  1. 分割由空格記錄或逗號:F"[ ,]"
  2. 由於我們正在創建新記錄,因此我們將cartFound變量設置爲0cartFound=0
  3. 我們打印使用printf前三個字段,因此不會扔在一個換行符:printf "%s %s %s", $1, $2, $3;
  4. 我們通過其餘字段與一個for循環分配每個場序變量ifor (i=4;i<=NF;++i){
  5. 如果該字段的值Shopping然後我們確立了cartFound變量1if($i=="Shopping"){cartFound=1}
  6. 如果cartFound1然後我們再次使用printf將字段添加到我們的輸出:if(cartFound==1){ printf " %s", $i}
  7. 如果我們打的一個哈希然後設置cartFound0啓動現場:if($i ~ /^#/){cartFound=0}
  8. 最後我們printf了一個換行符結束輸出記錄:{printf "\n"}
0

的sed方法:

sed -En 's/^([^,]+),.+(Shopping.{11}).*/\1 \2/p' testfile 

Dagmar Schlecht(ID: 1233) Shopping cart #3664 
0
awk '{print $1,$2,substr($3,1,5),$10,$11,$12}' file 

Dagmar Schlecht(ID: 1233) Shopping cart #3664