尝试通过GNU Awk 3.1.7读取数据

时间:2015-09-25 11:23:29

标签: linux awk

基本上我想读取第21或第51号字段但我无法读取确切的数据我得到的字段不正确。

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$

任何想法

3 个答案:

答案 0 :(得分:2)

使用GNU awk 4. * for FPAT:

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

你说你正在使用gawk 3.1.7 - 这是非常老的,因为你缺少一些有用的功能而得到一个新版本。

答案 1 :(得分: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

也许你需要这个:

lo@ubuntu:~$ awk -F ',' '{print $23,$52}' test.txt 
9772385 $3005A$
99827837 $3005A$

答案 2 :(得分:0)

这是CSV数据,“,”作为字段分隔符,“$”作为引号字符。使用具有适当CSV解析器的语言。我喜欢Ruby:

fieldX
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