如何从行转换为列?
我有一个.txt文件,其数字排序如下(在同一行):
106849_01373 106849_01967 106850_00082 23025.7_01059
我想像他们那样转换它们:
106849_01373 106849_01967 106850_00082 23025.7_01059
我不知道使用哪个命令。 有人可以帮我这个吗?
这是一个与xargs
xargs -n1 < file.txt
演示:
$ cat file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059 $ xargs -n1 < file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059
用tr
很容易:
tr -s '[:blank:]' '\n'
例:
% cat file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 % tr -s '[:blank:]' '\n'
heemayl的答案是要走的路,但是这里有一个使用Perl的替代方案:
perl -lane '$,="\n"; print(@F)' file.txt
-
-l
:启用自动行结束处理。 它有两个独立的效果。 首先,当与-n或-p一起使用时,它会自动选择$ /(输入记录分隔符)。 其次,它将$ \(输出记录分隔符)赋值为octnum,以便任何print语句都重新添加该分隔符。 如果省略octnum,则将$ \设置为当前值$ /。 -
-a
:与-n或-p一起使用时打开自动分割模式。 对@F数组的隐式拆分命令是由-n或-p生成的隐式while循环中的第一个内容。 -
-n
:使Perl在程序周围采用以下循环,这使得迭代文件名参数有点像sed -n或awk:LINE: while (<>) { ... # your program goes here }
-
-e
:可用于输入一行程序; -
$,="\n"
:将输出字段分隔符设置为换行符; -
print(@F)
:打印由输出字段分隔符分隔的字段。
% cat file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059 % perl -lane '$,="\n"; print(@F)' file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059
AWK
方法。 基本上更改字段的输出分隔符和循环。 测试文件是您在最后使用ENDLINE一遍又一遍地粘贴的示例
$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 106849_01373 106849_01967 106850_00082 23025.7_01059 ENDLINE 106849_01373 106849_01967 106850_00082 23025.7_01059 ENDLINE 106849_01373 106849_01967 106850_00082 23025.7_01059 ENDLINE
使用sed
:
sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
我只是为了好玩添加一个Python解决方案:
python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
此命令在“单引号”中运行单行Python 3脚本,其中包含要作为参数转换的文件名。 语法是这样的:
python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS
我们使用的1行脚本就是这样(为了清晰起见,扩展到多行):
import sys f=open(sys.argv[1]) print(*f.read().split(),sep="\n")
它导入sys
模块以读取命令行参数,将第一个给定参数作为文件名打开,并在一行中从文件中打印每个空格分隔的数据块。
$ cat mytestfile 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 $ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059 106849_01373 106849_01967 106850_00082 23025.7_01059