用值填充特定列中的空行

用值填充特定列中的空行

我有以下格式的数据:

2342 1
6473 2
7463 2
3647
2734 1
9343

第二列中没有值的行在该位置为空(即没有空格、制表符等)。我正在寻找一个简单的命令,将“-9”放在第 2 列的空位中。

(基本上是一个awk检查第 2 列中的行是否非零的命令,然后添加“-9”(如果是这种情况)应该这样做。)

扩展示例(具有更多列的数据,其中一些包含缺失值)。我只想将“-9”添加到最后一列(即其他列允许有缺失)。

2342 0 12 1
6473   13 2
7463 0 14 2
3647 0  
2734 0    1
9343 0 16 

答案1

如果您的数据以固定宽度列表示,您可以这样做:

对于第一种情况:

sed 's/^.\{4\}$/& -9/'

(添加" -9"到 4 个字符的行)。

对于第二种情况:

sed -e '/.\{11\}/b' -e 's/$/          /;s/\(.\{10\}\).*/\1-9/'

(对于少于 11 个字符的行添加最多 10 个空格和 -9)。

一般来说,要解析具有固定宽度字段的行,请参阅FIELDWIDTHSGNU 的特殊变量awk

答案2

使用 GNU sed

sed ':;s/^.\{0,9\}$/& /;t;s/^.\{10\}$/&-9/' file

只要字符数低于十,就使用 test 添加一个空格t
然后将具有十个字符的行替换为自身并-9.

答案3

您可以尝试使用awk第一个示例:

awk 'NF == 1 { $2 = -9; } 1' file

正如其他帖子中提到的,gawk您可以使用FIELDWIDTHS,因此您可以在第二个帖子中尝试此操作:

gawk 'BEGIN { FIELDWIDTHS = "4 1 1 1 2 1 1"} { for (i = 1; i <= NF; i++) { if ($i == "") { if (i == 7) $i = "-9"; else $i = " "; } } printf("%s %s %s %s\n", $1, $3, $5, $7); }' file

答案4

你可以使用这个:

perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

此命令按行读取您的输入,并在第二列(如果为空)中打印“-9”。

echo "2342 1
6473 2
7463 2
3647
2734 1
9343" | perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

2342 1
6473 2
7463 2
3647 -9
2734 1
9343 -9

相关内容