以下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」 的
以下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」 的
kent$ echo "1 abc
1 \N
\N xyz"|awk '{gsub(/\\N/,"0",$2)}1'|column -t
1 abc
1 0
\N xyz
分開試試這個:
sed -r 's/^([^\t]+\t)\\N/\10/' nulltest.txt
如果你的文件是10GB大小,並且你有很多連續的字段,肯定awk比sed更容易使用。但csv解析器應該更好......將其設置爲分隔符。 – N4553R 2012-08-01 14:11:34
你可以在使用下面的正則表達式您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
注意,正是\N
從2nd
列被替換。即使有\N
這個sed表達式的列數將會只取代2nd
列中的\N
列。
這只是一個例子。實際文件大於10GB,並有16列。 – shantanuo 2012-08-01 12:16:13