1 bash sed awk text-processing
这是一个反复出现的主题,但仍然没有重复,因为我尝试了所有解决方案,但没有一个对我有用。
我正在尝试将后缀“_1”添加到从 txt 文件导入的标识符列表中。目标是将其添加到函数中的循环中。
GSE72343.txt:
SRR2182285
SRR2182286
SRR2182287
SRR2182288
SRR2182289
Run Code Online (Sandbox Code Playgroud)
我想检索这个:
SRR2182285_1
SRR2182286_1
SRR2182287_1
SRR2182288_1
SRR2182289_1
Run Code Online (Sandbox Code Playgroud)
我在这里和这里的其他线程中尝试了一些建议,但我得到了错误的输出,如下所示:
for i in $(cat GSE72343.txt); do echo "$i" "$i_1"; done
RR2182285
RR2182286
RR2182287
RR2182288
RR2182289
sed 's/$/ _1/' GSE72343.txt
_12182285
_12182286
_12182287
_12182288
_12182289
awk '{ print $0, "_1" }' GSE72343.txt
_12182285
_12182286
_12182287
_12182288
_12182289
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?非常感谢!
您的问题是您的文件具有 Windows 样式的行尾 ( \r\n
)。这就是您的命令失败的原因。如果您修复了该文件,它们应该会按预期工作。如果你有dos2unix
,你可以这样做:
dos2unix GSE72343.txt
Run Code Online (Sandbox Code Playgroud)
但如果没有,您也可以使用sed
:
sed -i 's/\r$//' GSE72343.txt
Run Code Online (Sandbox Code Playgroud)
之后,您的命令将起作用(稍作更改)。而且,作为概念证明:
$ printf 'SRR2182285\r\nSRR2182286\r\n' > GSE72343.txt
$ cat GSE72343.txt
SRR2182285
SRR2182286
$ for i in $(cat GSE72343.txt); do echo "$i" "${i}_1"; done
RR2182285
RR2182286
$ sed -i 's/\r$//' GSE72343.txt
$ for i in $(cat GSE72343.txt); do echo "$i" "${i}_1"; done
SRR2182285 SRR2182285_1
SRR2182286 SRR2182286_1
Run Code Online (Sandbox Code Playgroud)
最后,如果您不想修改原始文件,则可以使用问题中的任何方法,但只需| tr -d '\r'
在最后加上a 。例如:
$ sed 's/$/_1/' GSE72343.txt | tr -d '\r'
SRR2182285_1
SRR2182286_1
SRR2182287_1
SRR2182288_1
SRR2182289_1
Run Code Online (Sandbox Code Playgroud)