我有以下格式的数据:
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)。
一般来说,要解析具有固定宽度字段的行,请参阅FIELDWIDTHS
GNU 的特殊变量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