Bash 为什么这段代码不能用换行符替换空格?
我有这样一个文件:Bash 为什么这段代码不能用换行符替换空格?,bash,awk,sed,cut,tr,Bash,Awk,Sed,Cut,Tr,我有这样一个文件: 17336 GRMZM2G000118 GRMZM2G000118 190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854 307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028 17336 GRMZM2G000118 GRMZM2G000118 190
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
由空格分隔的行我试图将字段从第二个字段剪切到最后,并将其转换为一列:
输出应该是
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
...
GRMZM2G000118
GRMZM2G000118
...
使用此命令:
cut -f 2- < input.txt | tr " " "\n" > new_file.txt
我的问题是为什么第一种方法不起作用?像这样做:cut-d'-f2-new_file.txt
编辑:说明:您需要为字段添加分隔符。以下命令适用于我(假设分隔符是空格)
cut-d”“-f2-new_file.txt
GRMZM2G00118GRMZM2G00118
GRMZM2G0404941
GRMZM2G0404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028
是否可以添加更多信息,如您使用的分隔符?
cut
默认情况下,假定字段由单个制表符分隔。不可能在每个字段之间指定可变数量的空格,这似乎就是输入数据中的空格
我个人建议使用您在问题中显示的awk脚本或类似的脚本。我建议使用此awk:
awk -v OFS="\n" '{sub(/^[[:space:]]*[^[:space:]]*[[:space:]]*/, ""); $1=$1} 1' file
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028
sub
带有^[[:space:][]*[^[:space:][]*[:space:][]*
的函数用于从每行中删除第一列
使用cut
会给多个空格带来问题,因为它会将它们转换为多个换行符
我有这样的文件:
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
以空格分隔的行我试图从第二行中剪切字段
字段结束,并将其转换为一列:输出应为
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
...
GRMZM2G000118
GRMZM2G000118
...
使用此命令:
cut -f 2- < input.txt | tr " " "\n" > new_file.txt
总之,您的命令应该是:
tr -s ' ' < input.txt | cut -d ' ' -f 2- | tr " " "\n" > new_file.txt
tr-s'new|u file.txt
现在您有了一堆命令,是时候转到awk版本了:)这可能与您有多个空格有关。您可能希望事先压缩它们:
tr-s'
。与OP在问题中使用的简单循环相比,它被认为是一个非常感谢的答案!嗯,我认为使用单个sub
比使用loopsed's/\s\+/\n/g'更好,而不是所有的努力,问题仍然是为什么tr”““\n”不能与cutI一起工作。我已经回答了为什么cut+tr
不能工作,因为有多个空格。您的sed
命令不会跳过每行的第一列,并留下多个换行符。此外,由于\s
和\n
的原因,该sed命令是GNU特定的,因此它不会在所有系统中工作。