更改特定列的值

时间:2012-08-01 11:54:20

标签: sed awk grep

以下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”

分隔

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以在sed表达式中使用以下正则表达式,以确保\N位于第2列。

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

因此,您的sed表达式将如下所示

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

<强>解释

^([^\t]+\t):匹配1后跟\t(),正则表达式使其成为第一个群组。

\\N:将匹配\N

(\t):第二列之后的tab是第二组。

sed的替换部分,请注意使用代表 第一和第二组 \1\2正则表达式,在您的情况下分别是1 followed by \t\t。因此它将保留第一组和第二组,并用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表达式也只会从\N列替换2nd

答案 2 :(得分:0)

试试这个:

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