2017-08-01 21 views
0

我有一個製表符分隔的文件,其中缺少值用點表示。例如:unix:獲取所有數值,包括非整數

VAR1 VAR2 VAR3 VAR4 
ID1  foo  0.1  0.1 
ID2  foo  1  1 
ID3  foo  foo  . 
ID4  foo  foo  foo 
ID5  foo  .  1 
ID6  foo  -0.1 -0.1 
ID7  foo  -1  -1 
ID8  foo  5e-08 5e-08 

我需要提取第三列中的值爲數字(包括非整數,負值,科學記數法)或缺失的所有行。所以我的輸出應該是這樣的:

VAR1 VAR2 VAR3 VAR4 
ID1  foo  0.1  0.1 
ID2  foo  1  1 
ID5  foo  .  1 
ID6  foo  -0.1 -0.1 
ID7  foo  -1  -1 
ID8  foo  5e-08 5e-08 

到目前爲止,我已經嘗試使用 awk -F"\t" 'BEGIN{OFS="\t"} ($3 ~ /^[[:alnum:]]+$/) {$1=$1; print}'在awk中這樣做,但後來我只得到

VAR1 VAR2 VAR3 VAR4 
ID2  foo  1  1 

我還想保存行在單獨的文件中不匹配(即非數字且不丟失)。

回答

4

如何鞠躬DAH:

$ awk '$3*1==$3 || $3=="." || NR==1' file 
VAR1 VAR2 VAR3 VAR4 
ID1  foo  0.1  0.1 
ID2  foo  1  1 
ID5  foo  .  1 
ID6  foo  -0.1 -0.1 
ID7  foo  -1  -1 

解釋:

  • NR==1我們正在處理的文件頭記錄
  • ||
  • $3=="."第三場是一段
  • ||
  • $3*1==$3第三場乘以一個仍然是相同的值
+0

謝謝,它像一個魅力。即使我後來認識到某些價值觀是以科學記數法 – Hill

2

請嘗試下面,讓我知道這是否有助於你。

awk 'NR==1{print;next} $3 !~ /[a-zA-Z]/' Input_file 

OR

awk 'NR==1{print;next} $3 ~ /[0-9]/' Input_file 
+0

感謝,他們都爲我最初提供的示例偉大的工作,但然後我意識到我的數據在科學記數法中有一些價值。 – Hill

+0

第一個會錯誤地匹配':-)',而第二個會錯誤地匹配'Joe90'。 –