2015-01-06 71 views
0

想知道如何處理下面的情況,樣本輸入用空格分隔,並且想要格式化爲逗號分隔的輸出。 直到以數字開頭的第一個字段爲止的所有文本都應視爲輸出中的單個字段。在示例數據中,行尾總是有3個數字字段;在實際數據中,有14個這樣的字段。awk處理未格式化的輸入

INPUT.TXT

mmm 4394850 4465411 2579770 
xxx yyy 2155419 2178791 1516446 
aaa bbb (incl. ccc) 14291585 14438704 6106341 
U.U.(W) 6789781 6882021 5940226 
nnn 7335050 7534302 2963345 

試過下面的命令,但我知道它是不完整:

awk 'BEGIN {FS =" "; OFS = ","} {print $1,$2,$3,$4,$5,$6} ' Input.txt 

所需的輸出:

mmm,4394850,4465411,2579770 
xxx yyy,2155419,2178791,1516446 
aaa bbb (incl. ccc),14291585,14438704,6106341 
U.U.(W),6789781,6882021,5940226 
nnn,7335050,7534302,2963345 
+2

。在你的企圖沒有邏輯,試圖應對處理數字領域不同。輸入始終是相同的格式?例如,每行的結尾總是有3個數字字段? –

+0

Tom Fenech,每行末尾有14個數字字段 – VNA

回答

2

隨着GNU AWK的gensub( ):

$ awk '{match($0,/[0-9 ]+$/); print substr($0,1,RSTART-1) gensub(/ /,",","g",substr($0,RSTART,RLENGTH))}' file 
mmm,4394850,4465411,2579770 
xxx yyy,2155419,2178791,1516446 
aaa bbb (incl. ccc),14291585,14438704,6106341 
U.U.(W),6789781,6882021,5940226 
nnn,7335050,7534302,2963345 

與其他awks,保存第二SUBSTR()在VAR和使用GSUB()輸出:

awk '{match($0,/[0-9 ]+$/); digs=substr($0,RSTART,RLENGTH); gsub(/ /,",",digs); print substr($0,1,RSTART-1) digs}' file 
+1

非常感謝Ed Morton,它工作得很好! – VNA

+1

埃德莫頓,我已經接受你的答案,並投票贊成! – VNA

1

假設這是最後3列中顯示的數值(如你的例子):

awk '{for(i=1;i<=NF;++i)printf "%s%s",$i,(i<NF-3?OFS:(i<NF?",":ORS))}' file 

根據字段編號,基本打印每個字段後跟一個空格,逗號或換行符。

+0

Tom Fenech,非常感謝,但上面的命令是失敗的,如果輸入行是A&B 8399153 8530270 131117輸出是A,&,B,8399153,8530270,131117 – VNA

+0

我無法使用我的代碼重現該輸出。你是否使用了代碼中的BEGIN塊? –

+0

湯姆Fenech,雅我明白這個問題,最後一列數字字段並不總是像14場,一些行有14場,其中一些10場數字等 – VNA

1

另一個AWK

awk '$0=gensub(/ ([0-9]+)/,",\\1","g")' file 


mmm,4394850,4465411,2579770 
xxx yyy,2155419,2178791,1516446 
aaa bbb (incl. ccc),14291585,14438704,6106341 
U.U.(W),6789781,6882021,5940226 
nnn,7335050,7534302,2963345 
+1

謝謝Jidder !!! – VNA