[英]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
我假設模式屬於有限集。 這樣就可以列出模式了。 為了簡化過程,我創建了一個gawk版本:
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.