2015-09-25 31 views
1

基本上我想讀取字段編號21或51,但我無法讀取確切的數據,我得到不正確的字段。嘗試通過GNU Awk讀取數據3.1.7

Logic:- awk -F ',' '{print $21,$50}' 

數據 - > Test.txt的

40968,SUR,ACT,1,Y,$GPNFT$,431068,SUR,MSUR,ACT,$DRS WRIGHT, HEWITT, GUNN & CHARLES$,$$,$PH8 0$,$DMB3005A$,UK,PH8 0AD,$BRAAN COTTAGE$,$$,$DUNKELD$,$PERTHSHIRE$,9772385,DOC,MED,ACT,Y,$GPNFT$,$METABOLIC$,$GAS ENDOSC$,M,$WRIGHT$,$GRAHAM$,$$,$$,$$,$$,$01-JAN-1959$,1982,,$U$,$Y$,$N$,$$,$N$,$002605139$,,$9772385$,$PH07$,$PH11$,$N$,$3005A$,$31-JUL-1997$,$00302620$,$00742230$,$$ 
594674,SUR,ACT,1,Y,$GVTRG$,431068,SUR,MSUR,ACT,$DRS WRIGHT, HEWITT, GUNN & CHARLES$,$$,$PH8 0$,$DMB3005A$,UK,PH8 0AD,$BRAAN COTTAGE$,$$,$DUNKELD$,$PERTHSHIRE$,99827837,DOC,MED,ACT,N,$GVTRG$,$$,$$,M,$GUNN$,$RODERICK$,$$,$$,$$,$$,$$,,,$U$,$N$,$N$,$$,$N$,$$,,$99827837$,$PH07$,$PH11$,$N$,$3005A$,$23-JUN-2010$,$00302620$,$00742230$,$$ 

輸出

$DUNKELD$ $PH11$ 
$DUNKELD$ $PH11$ 

期望輸出

9772385,$3005A$ 
1430701,$3005A$ 

任何想法

+0

我覺得應該是'的awk -F '' '的{打印$ 23 $ 52}''? – Mithrandir

+1

太多不必要的數據:http://stackoverflow.com/help/mcve –

+0

'1430701'在您的示例輸入中不存在,所以它不會出現在您的輸出中。 –

回答

0

我用這個

awk -F ',' '{for(i=1; i <= NF;++i) {if ($i== 9772385) {print i, $i}} }' test.txt` 

找到9772385列,這是23

awk -F ',' '{for(i=1; i <= NF;++i) { if($i ~ /3005A/) {print i, $i} } }' test.txt 

此找到3005A,這是52

也許你需要這樣的:

[email protected]:~$ awk -F ',' '{print $23,$52}' test.txt 
9772385 $3005A$ 
99827837 $3005A$ 
+0

感謝您的回覆它是一個單獨的字段$ DRS WRIGHT,HEWITT,GUNN和CHARLES $ here $(「)意味着分隔符。 – user2563207

2

使用了GNU AWK 4 *爲FPAT:

$ awk -v FPAT='([^,]*)|([$][^$]+[$])' -v OFS=, '{print $21, $50}' file 
9772385,$3005A$ 
99827837,$3005A$ 

你說你正在使用的gawk 3.1.7 - 這是極爲古老,得到新版本,因爲你缺少一個有用的功能TON。

+0

Ed Morton感謝您的回覆它是一個單獨的字段$ DRS WRIGHT,HEWITT,GUNN&CHARLES $ $(「)表示分隔符 – user2563207

+0

對不起,我不能在上面的消息中正確解釋$ means quote(」)然後字段看起來像這樣「DRS WRIGHT,HEWITT,GUNN&CHARLES」它合併成一個字段 – user2563207

+0

OK,我編輯我的答案,以顯示一個awk解決方案。 –

0

這是CSV數據,其中「,」作爲字段分隔符,「$」作爲引號字符。通過適當的CSV解析器使用語言。我喜歡紅寶石這樣的:

ruby -rcsv -e ' 
    csv_opts = {:col_sep => ",", :quote_char => "$"} 
    CSV.foreach(ARGV.shift, csv_opts) {|row| 
    puts CSV.generate_line([row[20], row[49]], csv_opts) 
    } 
' file 
9772385,3005A 
99827837,3005A 

沒有引號,因爲在那些需要引用輸出沒有內部逗號。您可以強制使用引號

ruby -rcsv -e ' 
    csv_opts = {:col_sep => ",", :quote_char => "$", :force_quotes => true} 
    CSV.foreach(ARGV.shift, csv_opts) {|row| 
    puts CSV.generate_line([row[20], row[49]], csv_opts) 
    } 
' file 
$9772385$,$3005A$ 
$99827837$,$3005A$ 
+0

thnx glenn for your reply我很新的紅寶石時,我使用上面的代碼我得到下面的錯誤-e:1:語法錯誤,意外的tCONSTANT,期待$尾 .. 。$「,::force_quotes => true} CSV.foreach(ARGV.shift,csv_opts)... – user2563207

+0

我使用的是ruby v2.2 –