簡體   English   中英

在awk或grep的列中分隔數字

[英]Separating a number within a column in awk or grep

我正在編寫一個腳本,該腳本將處理除第一列之外的所有列中的文件,$ 1。 我要重定向到另一個文件的內容取決於第三列的值,並且我知道該如何區分,但是我想重定向第一列而不是整個第一列的“ id” -number:

不同的輸入文件格式:

1452123_s_at        0.45609 1.55e-04    7.85    -2.89   2.657
145243_s_at         0.35709 1.46e-04    7.7     -2.9    2.713

Xl.15267.1.A1_at    0.45609 1.79e-04    7.66    -2.9    2.21
Xl.14257.1.A1_at    0.76509 1.67e-04    7.85    -2.87   2.23

160919_r_at         0.45609 1.83e-04    -7.63   -2.9    -2.888
145916_r_at         0.41869 3.82e-04    -7.56   -2.8    -2.798

162334_r_at         0.51869 2.49e-04    -7.24   -2.93   -2.095
15356_r_at          0.68229 1.79e-04    -7.45   -2.88   -2.5

160365_at           0.68223 3.82e-04    -6.72   -2.98   -1.795
16345_at            0.45623 2.94e-04    -5.99   -2.45   -1.568

26768               0.51869 1.83e-04    7.66    -2.9     2.21
30075               0.67749 1.46e-04    7.45    -2.89    2.34

所需的輸出:

1452123     1.55e-04    
145243      1.46e-04    
15267       1.79e-04    
14257       1.67e-04    
160919      1.83e-04    
145916      3.82e-04    
162334      2.49e-04    
15356       1.79e-04    
160365      3.82e-04    
16345       2.94e-04    
26768       1.83e-04    
30075       1.46e-04    

這個數字幾乎可以是1到1000萬之間的任何數字,整個第一列的結構可能會比此示例稍大一些,但是它將始終在其中包含這個數字。 有什么辦法寫出足以識別和打印該號碼的通用性的東西? 通過使用拆分還是某種方式?

使用哪個程序,awk,grep或sed都沒有關系,我只是在尋找最有效的方法。 我對命令行也很陌生,所以請簡單解釋一下不同的命令! 謝謝

只需使用gsub()除去非數值,然后打印:

awk 'NF{gsub(/[^0-9]/,"",$1); print $1, $3}' file

它返回:

1452123 1.55e-04
145243 1.46e-04
1526711 1.79e-04
1425711 1.67e-04
160919 1.83e-04
145916 3.82e-04
162334 2.49e-04
15356 1.79e-04
160365 3.82e-04
16345 2.94e-04
26768 1.83e-04
30075 1.46e-04

說明

  • NF在執行下面的命令{}只是如果NF是真實的,那就是,如果該行不為空。
  • gsub(/[^0-9]/,"",$1)用於第一個字段,刪除所有不在0-9范圍內的字符。 即,刪除所有非數值。
  • print $1, $3打印第一個和第三個字段。

我將拆分非數字字符,並選擇剩下的最大數字。 以下是我的實現,感謝@fedorqui的NF技巧

NF{n=split($1,a,/[^0-9]+/); v=a[1]; for(i=2; i<=n; i++) { if (v<a[i]) v=a[i]; } print v, $3}

用gensub()的GNU awk:

$ awk 'NF{ print gensub(/([^._]*[._])?([[:digit:]]+).*/,"\\2","",$1), $3 }' file
1452123 1.55e-04
145243 1.46e-04
15267 1.79e-04
14257 1.67e-04
160919 1.83e-04
145916 3.82e-04
162334 2.49e-04
15356 1.79e-04
160365 3.82e-04
16345 2.94e-04
26768 1.83e-04
30075 1.46e-04

我假設模式屬於有限集。 這樣就可以列出模式了。 為了簡化過程,我創建了一個版本:

awk '
NF && ( match($1,/^([0-9]+)((_[rs])?_at)?$/,a) ||
match($1,/^Xl\.([0-9]+)\.1\.A1_at$/,a) ) {
    printf("%-12s%-s\n", substr($1, a[1,"start"], a[1,"length"]), $3)
}
' inputfile

第一個match檢查四種模式: <NUM>_s_at<NUM>_r_at<NUM>_at<NUM> 最后Xl.<NUM>.1.A1_at 然后切斷匹配的數字並格式化輸出。

輸出:

1452123     1.55e-04
145243      1.46e-04
15267       1.79e-04
14257       1.67e-04
160919      1.83e-04
145916      3.82e-04
162334      2.49e-04
15356       1.79e-04
160365      3.82e-04
16345       2.94e-04
26768       1.83e-04
30075       1.46e-04

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM