如何从行转换为列?


11

我有一个.txt文件,其编号按此顺序排列(在同一行上):

106849_01373    106849_01967    106850_00082    23025.7_01059   

我想这样转换它们:

106849_01373
106849_01967
106850_00082
23025.7_01059

我不知道该使用哪个命令。有人可以帮我吗?

Answers:


5

这是一个 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

1
xargs是一个很棒的工具,如果您没有提到它,我会这样做的,但是它确实有一个缺点,就是如果您省略该命令,它将代替echo(与某些shell不同,xargs没有内置的echo) -n1告诉xargs为每个arg调用命令,因此在此示例中,您至少要涉及六个进程(用于执行io重定向的shell,xargs和四个回声)。在这个范围内,这还算不错,但是在输出几千行时,它的速度明显要慢一些。
hildred '16

16

相当容易tr

tr -s '[:blank:]' '\n' <file.txt

例:

% 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' <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

2

heemayl的答案是解决之道,但是这是使用Perl的替代方法:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l:启用自动行结束处理。它有两个单独的作用。首先,当与-n或-p一起使用时,它会自动砍掉$ /(输入记录分隔符)。其次,它将$ \(输出记录分隔符)分配为octnum的值,以便任何打印语句将重新添加该分隔符。如果省略octnum,则将$ \设置为$ /的当前值。
  • -a:当与-n或-p一起使用时,将打开自动分割模式。对@F数组的隐式split命令是由-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

1

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

1

使用sed

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

不quite..it将每个(初始)行之后添加一个尾随的换行符..
heemayl

用多行检查,然后您会得到一个清楚的案例
。.– heemayl

您能为您的答案加上一个例子吗?
heemayl

@heemayl您的意思是,它会将尾随空格变成换行符。您的语法难以理解。:/
techraf

1

我只是添加一个有趣的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.