2016-09-26 26 views
2

我有一個數據是這樣的:查找分隔符,並打印第二陣列

A=5 B=8 . C=8 
A=4 . . C=4 
A=8 . . C=3 

我需要檢查所有列在我的文件,如果我找到letter=number(例如A = 5),我只需要number打印。如果有缺失值(.),請跳過它。

所以輸出應該是:

5 8 . 8 
4 . . 4 
8 . . 3 

我會用awk:

awk -v OFS="\t" '{split($0,arr2,"="); print arr2[2]}' infile.txt 
+0

不,它不是固定取出FOO=。列數是可變的。 – Paul

回答

1

隨着GNU awk的,你可以這樣做:

$ awk -F= -vRS='[ \t\n]+' '{printf "%s%s", (NF>1?$NF:$0), RT}' file 
5 8 . 8 
4 . . 4 
8 . . 3 

awk中的方式隔開它的輸入記錄,記錄到字段。通過-vRS='[ \t\n]+',我們將記錄分隔符設置爲一系列空格,製表符或換行符。我們還將字段分隔符-F=設置爲等號。所以基本上我們把輸入分成記錄,每個記錄都是一個單詞,然後我們使用=作爲分隔符將記錄分割成字段。

使用這個零件'{printf "%s%s", (NF>1?$NF:$0), RT}'我們打印所需的輸出。對於每條記錄,我們可以有兩種情況:如果字段數(變量NF)大於1,表示我們有一個等於,所以我們保留記錄的最後一個字段爲$NF。如果記錄有單個字段(不等於),我們保持該字段不變。我們首先打印所需的值,然後打印存儲在RT變量中的拆分字段時匹配的分隔符。

+0

嗨,謝謝你的回覆,看起來這是工作得很好。但我需要複製/粘貼我的infile.xls的名稱 - 當我按TAB時,它不顯示我的文件。哪裏可能會出現問題? AWK版本? – Paul

+0

@Paul:awk版本不應該與tab完成有關,該功能來自bash,我認爲。 – user000001

+0

但仍然你的腳本工作得很好。將有可能評論部分?什麼是vRS? RT? :)) – Paul

3

一個快速和骯髒的方式做到這一點是sed的:

sed -e 's/[A-Z]\+=//g' infile.txt 

這只是刪除(一堆)字母的所有實例後跟一個等號。

+2

值得注意的是'\ +'是非標準的,所以在某些版本中需要'-E'和'+'(或者只是使用'*',因爲它也可以)。 –

+0

@redneb sed中的驚人解決方案。也許比awk更容易.. – Paul

2

awk到interate在田野上,並從開始剝離的部分高達=如果該字段以字母開頭,然後=,然後任意數量的結尾:

awk '{for(i=1; i<=NF; i++) if($i~/^[A-Za-z]=[0-9]+$/) sub("^.*=", "", $i)}{print}' 

如果你的一個字字母,而不是一個單一的一個:

awk '{for(i=1; i<=NF; i++) if($i~/^[A-Za-z]+=[0-9]+$/) sub("^.*=", "", $i)}{print}' 

實施例:

$ cat file.txt 
A=5 B=8 . C=8 
A=4 . . C=4 
A=8 . . C=3 

$ awk '{for (i=1; i<=NF; i++) if ($i~/^[A-Za-z]=[0-9]+$/) sub("^.*=", "", $i)} { print }' file.txt 
5 8 . 8 
4 . . 4 
8 . . 3 
+0

感謝您的回覆。當我在大量數據上測試解決方案時,它不起作用。實際上,在實際的數據集不是A,B,C ...等,但有真實的詞像 - IMPACT = 151,ENSP = 544,PHENO = 512 ...等。 – Paul

+0

@Paul檢查我的編輯。 – heemayl

+0

運行腳本後仍然沒有修改文件:-(。文件是製表符分隔的。任何想法? – Paul

4

這AWK一個班輪可與GAWK:

awk -F'\\S*=' -v OFS="" '{$1=$1}7' file 
5 8 . 8 
4 . . 4 
8 . . 3 

的想法是:通過設置FS

+0

看起來你有最短的解決方案,它的作品非常好。 – Paul

1
awk '{gsub(/[A-Z]=/,"")}1' file 

5 8 . 8 
4 . . 4 
8 . . 3 
+0

很好用的gsub功能...謝謝你的回覆! – Paul