追加一列

追加一列

我已经在这里和其他一些地方搜寻过,试图找到这个问题的答案,但它似乎太简单了,以至于没有人回答它。我需要做的就是在新列中将单个值添加到每行的末尾。我发现的最接近的是使用sed -i "s/$/green/" ./test.txt,但这会将绿色值添加到下一行,我需要将其添加为当前最后一列之后的新列

我有一个这样的文件:

chr -   xyz ordered_A01 5480    6144
chr -   xyz ordered_A01 5480    58001

我需要它看起来像这样:

chr -   xyz ordered_A01 5480    6144    green
chr -   xyz ordered_A01 5480    58001   green

但我得到的是这个:

chr -   xyz ordered_A01 5480    6144
green
chr -   xyz ordered_A01 5480    5801
green

答案1

您问题中的 sed 命令实际上是正确的。如果您在新行上看到结果,则说明您的终端设置为窄,并且只是看到了换行,或者您的实际环境中包含了本示例中未向我们展示的代码。它按原样工作,但您应该注意两个问题:

  1. $在双引号字符串内用作表达式的一部分是危险的。通常它会扩展为 bash 变量。在这种情况下,您逃脱了它,因为它/后面的字符不是有效的有价值的名称,但为了避免这种情况,您确实应该在表达式周围使用单引号。

  2. 如果您想将内容作为列对齐,您可能应该在行尾和要添加的值之间包含某种分隔符。制表符可能是执行此操作的最简单方法,但您可能应该使用其他字段之间已有的任何分隔符。

组合起来,固定命令可能看起来像这样:

sed -i 's/$/\tgreen/' ./test.txt

如果结果没有按照您想要的方式排列,您可能会考虑通过管道传输数据col来排列列。

至于您没有向我们展示的内容,问题可能出在您的数据文件中。既然您在评论中提到了写字板和 Excel。我猜你有一个混合的 Windows/Unix 环境。我怀疑问题是您的数据文件在行尾之前有垃圾非打印序列。你应该做点什么来清理它。一个简单的sed 's/\s*$//'可能是一个开始的地方(除了最后一个换行符之外,在行末尾去除所有空白字符),但是像 dos2unix 转换器这样的更高级的系统可能会给你更好的结果。如果你有二进制垃圾,并且文件应该是 ASCI 文本,你可以尝试用tr -cd '\11\12\15\40-\176'.

答案2

你可以使用awk

awk '{printf "%s", $0 "\tgreen\n"}' infile > outfile

答案3

您可以在 Ex 模式下使用 Vim:

ex -sc '%s/$/\tgreen/|x' test.txt
  1. %选择所有行

  2. \t标签

  3. x保存并关闭

相关内容