为什么这段代码没有用换行符替换空格?
Why is this code not replacing spaces with newlines?
我有这样一个文件:
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
行由 space
分隔
我试图从第二个字段剪切字段直到结束,并将其转换为一列:
输出应该是
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'
我的问题是为什么第一种方法行不通?
这样做:
cut -d' ' -f2- <input.txt | tr " " "\n" > new_file.txt
编辑:
说明:您需要为您的字段添加分隔符。
以下命令对我有用(假设分隔符是 space)。
cut -d " " -f 2- <input.txt | tr " " "\n" >new_file.txt
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028
您能否添加更多信息,例如您使用的分隔符?
cut
默认假定字段由单个制表符分隔。不可能在每个字段之间指定可变数量的空格,这似乎是您输入数据中的空格。
我个人建议使用您在问题中显示的 awk 脚本或类似脚本。
我建议使用这个 awk:
awk -v OFS="\n" '{sub(/^[[:space:]]*[^[:space:]]*[[:space:]]*/, ""); =} 1' file
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028
sub
函数和 ^[[:space:]]*[^[:space:]]*[[:space:]]*
用于从每一行中删除第一列。
使用 cut
会对多个空格造成问题,因为它将它们转换为多个换行符。
I have file like this:
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
line delimited by space I was trying to cut fields from the second
field till end, and convert it to be one column: output should be
GRMZM2G000118
GRMZM2G000118
...
using this command:
cut -f 2- < input.txt | tr " " "\n" > new_file.txt
My question is why the first way do not work?
你这里有两个问题:
cut
的默认分隔符是制表符。
- 多个空格不会与
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 版本了:)
我有这样一个文件:
17336 GRMZM2G000118 GRMZM2G000118
190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854
307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
行由 space
分隔
我试图从第二个字段剪切字段直到结束,并将其转换为一列:
输出应该是
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'
我的问题是为什么第一种方法行不通?
这样做:
cut -d' ' -f2- <input.txt | tr " " "\n" > new_file.txt
编辑:
说明:您需要为您的字段添加分隔符。
以下命令对我有用(假设分隔符是 space)。
cut -d " " -f 2- <input.txt | tr " " "\n" >new_file.txt
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028
您能否添加更多信息,例如您使用的分隔符?
cut
默认假定字段由单个制表符分隔。不可能在每个字段之间指定可变数量的空格,这似乎是您输入数据中的空格。
我个人建议使用您在问题中显示的 awk 脚本或类似脚本。
我建议使用这个 awk:
awk -v OFS="\n" '{sub(/^[[:space:]]*[^[:space:]]*[[:space:]]*/, ""); =} 1' file
GRMZM2G000118
GRMZM2G000118
GRMZM2G404941
GRMZM2G404922
GRMZM2G104854
GRMZM5G800488
GRMZM5G800488
GRMZM2G152059
GRMZM2G152059
GRMZM2G152028
GRMZM2G152028
sub
函数和 ^[[:space:]]*[^[:space:]]*[[:space:]]*
用于从每一行中删除第一列。
使用 cut
会对多个空格造成问题,因为它将它们转换为多个换行符。
I have file like this:
17336 GRMZM2G000118 GRMZM2G000118 190207 GRMZM2G404941 GRMZM2G404922 GRMZM2G104854 307596 GRMZM5G800488 GRMZM5G800488 GRMZM2G152059 GRMZM2G152059 GRMZM2G152028 GRMZM2G152028
line delimited by space I was trying to cut fields from the second field till end, and convert it to be one column: output should be
GRMZM2G000118 GRMZM2G000118 ...
using this command:
cut -f 2- < input.txt | tr " " "\n" > new_file.txt
My question is why the first way do not work?
你这里有两个问题:
cut
的默认分隔符是制表符。- 多个空格不会与
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 版本了:)