2012-08-01 69 views
0

以下sed命令按預期工作。我需要做的是僅在第二列中將null(\ n)更改爲0。更改特定列中的值

# cat nulltest.txt 
1 abc 
1 \N 
\N xyz 

# sed 's/\\N/0/' nulltest.txt 
1 abc 
1 0 
0 xyz 

預期結果:

1 abc 
1 0 
\N xyz 

數據由標籤 「\ t」 的

+0

這只是一個例子。實際文件大於10GB,並有16列。 – shantanuo 2012-08-01 12:16:13

回答

2
kent$ echo "1 abc 
1 \N 
\N xyz"|awk '{gsub(/\\N/,"0",$2)}1'|column -t 
1 abc 
1 0 
\N xyz 
0

分開試試這個:

sed -r 's/^([^\t]+\t)\\N/\10/' nulltest.txt 
+0

如果你的文件是10GB大小,並且你有很多連續的字段,肯定awk比sed更容易使用。但csv解析器應該更好......將其設置爲分隔符。 – N4553R 2012-08-01 14:11:34

1

你可以在使用下面的正則表達式您sed確保01的表達在第二欄。

^([^\t]+\t)\\N(\t) 

所以你sed表達式將類似於下面

sed -r -i 's/^([^\t]+\t)\\N(\t)/\10\2/g' nulltest.txt 

說明:

^([^\t]+\t):將匹配之後\t()1周圍的正則表達式使得第一組。

\\N:將匹配\N

(\t):它的tab後第二列是第二組。

sed通知使用的\1\2其表示第一組和第二組從正則表達式而你的情況是1 followed by \t\t分別substitue部。因此,它將保留第一組和第二組,並用0替換匹配字符串的其餘部分。

在我的測試中,我使用下面的輸入文件

abcdefgh 
3 abc \N \N \N 
123 \N \N \N 
\N \Nxyz 

和輸出我得到的是

abcdefgh 
3 abc \N \N \N 
123adsa 0 \N \N 
\N \Nxyz 

注意,正是\N2nd列被替換。即使有\N這個sed表達式的列數將會只取代2nd列中的\N列。