1

我有一个文件,我想替换一个以行尾结尾的模式\n......我已经在网上搜索了一种方法来做到这一点,但它们都不起作用......我能够替换结尾行到其他事物,但不包含包含行尾的模式..

这是一个例子文本文件有这个:

22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,

最后一行缺少一个值(它可以在任何其他行中),我想找到\n并替换为 a ,-999

于是文字变成了这样:

22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999

有任何想法吗 ????

4

7 回答 7

2

你可以说:

sed 's/,[^0-9]*$/,-999/' filename
于 2013-07-22T13:18:24.027 回答
2

awk

awk 'BEGIN{FS=OFS=","}{if($11==""){$11="-999"};print}' your.file

-999如果第 11 列为空,该命令将设置为


用户sudo_O建议使用上述脚本的一个版本,该版本遵循相同的逻辑,但看起来更简洁:

awk '$11==""{$11=-999}1' FS=, OFS=, your.file 
于 2013-07-22T13:24:59.743 回答
1

这个 sed 应该工作:

sed -i.bak 's/, *$/&999/' file
于 2013-07-22T13:12:37.117 回答
0

也许您可以使用 awk 分隔符变量,如下所示:

#!/usr/bin/awk -f
BEGIN {
    FS=",";
    OFS=",";
}
{
    if ( $11 == "") {
        print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,"-999"
    } else {
        print $0
    }
}
于 2013-07-22T13:20:03.797 回答
0

这可能对您有用(GNU sed):

sed -r 's/[^,]+/&/11;t;s/$/-999/' file

如果没有第十一个字段追加-999

于 2013-07-22T20:07:08.697 回答
0
$ awk '{print $0 (/,$/?-999:"")}' file
22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999

或者如果你喜欢高尔夫:

$ awk '/,$/{$0=$0"-999"}1' file
22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999

就个人而言,我只是为此使用已发布的简单 sed 解决方案之一,例如@anubhava's

于 2013-07-22T14:27:56.263 回答
0

也许替换,\n,-999\n

sed 's/\,\n&/\,-999\n&/g' file_name
于 2013-07-22T13:09:59.523 回答