为什么这段代码没有用换行符替换空格?

时间:2016-07-26 11:22:30

标签: bash awk sed cut tr

我有一个这样的文件:

17336   GRMZM2G000118   GRMZM2G000118  
190207  GRMZM2G404941  GRMZM2G404922   GRMZM2G104854   
307596  GRMZM5G800488   GRMZM5G800488 GRMZM2G152059   GRMZM2G152059   GRMZM2G152028   GRMZM2G152028

以空格分隔的线 我试图从第二个字段切割字段直到结束,并将其转换为一列:
输出应该是

GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922   
GRMZM2G104854
...

使用此命令:

cut -f 2- < input.txt | tr " "  "\n" > new_file.txt

但它不起作用

解决它的唯一命令是:

 awk '{for(i=2;i<=NF;++i)print $i}'  

 sed  's/\s\+/\n/g'

我的问题是为什么第一种方式不起作用?

5 个答案:

答案 0 :(得分:1)

以下命令对我有用(假设分隔符是空格)。

cut -d " " -f 2- <input.txt | tr " " "\n" >new_file.txt

GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028

您可以添加更多信息,例如您使用的分隔符吗?

答案 1 :(得分:1)

我建议使用这个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可能会为多个空格带来问题,因为它会将它们转换为多个换行符。

答案 2 :(得分:1)

  

我的文件是这样的:

17336   GRMZM2G000118   GRMZM2G000118  
190207  GRMZM2G404941  GRMZM2G404922   GRMZM2G104854   
307596  GRMZM5G800488   GRMZM5G800488 GRMZM2G152059   GRMZM2G152059   GRMZM2G152028   GRMZM2G152028
     

以空格分隔的行我试图从第二行切割字段   字段直到结束,并将其转换为一列:输出应为

GRMZM2G000118
GRMZM2G000118
...
     

使用此命令:

cut -f 2- < input.txt | tr " "  "\n" > new_file.txt
     

我的问题是为什么第一种方式不起作用?

这里有两个问题:

  • cut的默认分隔符是TAB。
  • 多个空格不会与cut挤在一起,与awk相反。

要解决第一个问题,请使用-d ' '设置分隔符。要解决第二个问题,请使用tr -s ' '

挤压空格
$ echo "hello     how are you" | cut -f2-
hello     how are you
$ echo "hello     how are you" | cut -d' ' -f2-
    how are you
$ echo "hello     how are you" | tr -s ' ' | cut -d' ' -f2-
how are you

你的命令应该是:

tr -s ' ' < input.txt | cut -d ' ' -f 2- | tr " "  "\n" > new_file.txt

所以现在你有一堆命令,时间转移到awk版本:)

答案 3 :(得分:0)

这样做:

cut -d' ' -f2- <input.txt | tr " " "\n" > new_file.txt

编辑:
说明:您需要为字段添加分隔符。

答案 4 :(得分:0)

默认情况下,

cut假定字段由单个制表符分隔。不可能在每个字段之间指定可变数量的空格,这似乎是您在输入数据中的空格。

我个人建议使用您在问题中显示的awk脚本,或者类似的东西。