2015-05-07 32 views
0

我有TSV的文件1,該結構如下:如何用tsv替換tsv中的空字符串?

col1 col2 col3 
1  4  3 
22 0  8 
3   5 

所以,最後一行看起來像3\t\t5,如果它被打印出來。我想用'NA'替換空字符串,以便該行將是3\tNA\t5。使用命令行執行此操作的最簡單方法是什麼?

回答

1

AWK是專爲這種情況(其中一百萬人;-))

awk -F"\t" -v OFS="\t" '{ 
     for (i=1;i<=NF;i++) { 
     if ($i == "") $i="NA" 
     } 
     print $0 
}' file > file.new && mv file.new file 

-F="\t"表示字段分隔符(也稱爲FS內部到awk)是製表符。我們還將輸出字段分隔符(OFS)設置爲"\t"

NF是一行數據上的字段數。 $i對於1到NF之間的每個值都被評估爲$1, $2, $3, ...

我們測試$i th元素是否爲空,if ($i == "")以及它是什麼時,我們將$i th元素更改爲包含字符串「NA」。

對於每一行輸入,我們打印行的($0)值。

awk腳本之外,我們將輸出寫入臨時文件,即file > file.new&&測試awk腳本沒有錯誤退出,如果正常,則將file.new移動到原始文件上。根據您的項目需要的安全和安全用例,您可能不想「破壞」您的原始文件。 IHD。

IHTH。

+0

謝謝,看起來像命令缺少'}',但? – orange1

+0

@ orange1:添加說明。你有沒有機會使用'orange'數據科學環境?祝你好運。 – shellter

+0

感謝您的補充說明。實際上,我不是。也給它一個快速谷歌,並找不到它。 – orange1

2

直接的方法是在地方

sed -i 's/^\t/NA\t/;s/\t$/\tNA/;:0 s/\t\t/\tNA\t/;t0' file 
  • sed -i編輯文件;

  • s/a/b/替換ab;

  • s/^\t/\tNA/在該行的開頭NA\t (第一列成爲NA)替換\t;

  • s/\t$/\tNA/最後一欄相同;

  • s/\t\t/\tNA\t/ insert NA in \t\t;

  • :0 s///; t0重複s///如果有替換(如果有其他缺失值在行中)。

+0

對於那些不熟悉'sed'的人來說,這個解釋可能很有用。 – nneonneo

+0

解釋這是什麼/如何工作會使這個有用的答案。 –

+0

我收到以下錯誤:'sed -i's/^ \ t/NA \ t /; s/\ t $/\ tNA /;:0 s/\ t \ t/\ tNA \ t /; t0'file1' sed:1:「file1」:invalid command code f – orange1