2012-01-07 39 views
0

我試圖通過替換由「:」分隔的2列的值來修改製表符分隔的文件,其中一列中存在空值:使用awk/sed替換其他列中的值如果一列值爲空使用awk/sed

開始與這個文件:

id1 id2 pos1 pos2 
749 2847443 21 13517135 
862 2821796 21 13571669 
997  21 13636494 
1095 2821826 21 13661335 
1131  21 13678797 

我想修改列2中得到這樣的:

id1 id2 pos1 pos2 
749 2847443 21 13517135 
862 2821796 21 13571669 
997 21:13636494 21 13636494 
1095 2821826 21 13661335 
1131 21:13678797 21 13678797 

的問題是還沒有空格(」「)表示空值。 現在我還沒有能夠與第3列,當它是空代替列2的值...

我一直在使用SED嘗試:

sed -e 's/\t\t/\t$3\t/g' input.txt > output 

其中一期工程,但它只是代替了文本'3美元',我找不到如何替換$ 3:$ 4的值。

我也曾嘗試AWK:

awk 'BEGIN { 
    IFS = OFS = "\t" 
} 
{ 
    for (column = 2; column <= NF; ++column) { 
    if ($column == "") { 
     $column = $3 
    } 
}  
print 
}   
' 
input.txt > output 

但是,這並不工作,要麼(既不使用「」也不是「」它什麼都不做其實...)

你能幫幫我嗎? 謝謝。

回答

3

檢查空值實際上很容易。但我不明白這個要求。哪一列可以爲空?在你的awk腳本中,你有$ 2 - > $ NF的循環,如果有空列,你沒有設置爲「:」分隔值,但設置爲3美元。 3美元左右是空的?

我假設只有$ 2(column2)可以爲null,那麼下面的awk行應該完成這項工作。

awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' file 

測試

<ff is your input file> 

kent$ awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' ff   
id1  id2  pos1 pos2 
749  2847443 21  13517135 
862  2821796 21  13571669 
997  21:13636494  21  13636494 
1095 2821826 21  13661335 
1131 21:13678797  21  13678797 

清楚地看到它,我們可以管道輸出到列命令:

kent$ awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' ff|column -t 
id1 id2   pos1 pos2 
749 2847443  21 13517135 
862 2821796  21 13571669 
997 21:13636494 21 13636494 
1095 2821826  21 13661335 
1131 21:13678797 21 13678797 

希望對你們有用。

+0

這可行(沒有-v,只是-OFS)非常感謝您的幫助! – user971102 2012-01-08 00:02:51

2

看前/後的文字,你張貼

B: 997  21 13636494 
A: 997 21:13636494 21 13636494 

要替換的第2列如果空
3rd + '**:**' + 4th column,對不對?

所以要爲這樣的:

sed 's/\(.*\)\t\t\(.*\)\t\(.*\)/\1\t\2:\3\t\2\t\3/g' testfile 

是匹配具有

東西tabtab一些標籤的東西

線,並與

更換第一列t AB第3列:第4列選項卡第3列選項卡第4列

例如:

$ cat testfile 
749 2847443 21 13517135 
862 2821796 21 13571669 
997  21 13636494 
1095 2821826 21 13661335 
1131  21 13678797 

$ sed 's/\(.*\)\t\t\(.*\)\t\(.*\)/\1\t\2:\3\t\2\t\3/g' testfile 
749 2847443 21 13517135 
862 2821796 21 13571669 
997 21:13636494 21 13636494 
1095 2821826 21 13661335 
1131 21:13678797 21 13678797 

注:這看起來只缺少第2列,因爲你談到怎麼樣

PS:如果您認爲回答您的問題,請不要忘記將其標記爲正確答案

+0

嗨,sed代碼不工作(它不會改變輸入文件),所以我會使用awk的Kent代碼,但感謝您的代碼和解釋。我仍然想知道爲什麼它不應該工作,但我的文字可能有些奇怪... – user971102 2012-01-08 00:08:10

相關問題