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

GRMZM2G00118
GRMZM2G00118
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特定的,因此它不会在所有系统中工作。