我已经在这里和其他一些地方搜寻过,试图找到这个问题的答案,但它似乎太简单了,以至于没有人回答它。我需要做的就是在新列中将单个值添加到每行的末尾。我发现的最接近的是使用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 命令实际上是正确的。如果您在新行上看到结果,则说明您的终端设置为窄,并且只是看到了换行,或者您的实际环境中包含了本示例中未向我们展示的代码。它按原样工作,但您应该注意两个问题:
$
在双引号字符串内用作表达式的一部分是危险的。通常它会扩展为 bash 变量。在这种情况下,您逃脱了它,因为它/
后面的字符不是有效的有价值的名称,但为了避免这种情况,您确实应该在表达式周围使用单引号。如果您想将内容作为列对齐,您可能应该在行尾和要添加的值之间包含某种分隔符。制表符可能是执行此操作的最简单方法,但您可能应该使用其他字段之间已有的任何分隔符。
组合起来,固定命令可能看起来像这样:
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
%
选择所有行\t
标签x
保存并关闭