按列分割文件
收藏

我知道cut命令可以从一个文件中剪切一列,但是我可以使用什么将一个文件拆分成多个文件,以便每个文件都命名为该列的第一行,并且生成的文件数量与原始文件中的列数量相同
示例(编辑)
列由制表符分隔,并且可以具有不同的长度。我希望第一个文件实际上有行的名称。

Probe File1.txt File2.txt File3.txt
"1007_s_at" 7.84390328616472 7.60792223630275 7.77487266222512
...

另外,这个原始文件非常大,所以我想要一些解决方案,可以在一次运行中拆分它。那不是反复的叫停


最佳答案:

一行锥子就能做到:

$ cat test.tsv
field1  field2  field3  field4
asdf    asdf    asdf    asdf
lkjlkj  lkjlkj  lkjlkj  lkjlkj
feh     feh     feh     bmeh

$ awk -F'\t' 'NR==1 {  for(i=1;i<=NF;i++) { names[i] = $i }; next } { for(i=1;i<=NF;i++) print $i >> names[i] }' test.tsv

$ ls
field1  field2  field3  field4  test.tsv

$ cat field4
asdf
lkjlkj
bmeh

编辑以包含Glenn Jackman提供的标签分隔符
添加
从字段中删除双引号:
awk -F'\t' 'NR==1 {  for(i=1;i<=NF;i++) { names[i] = $i }; next } { for(i=1;i<=NF;i++) {gsub(/"/,"",$i); print $i >> names[i] }}' example.tsv

额外增加
仅在字段的开头或结尾从字段中删除双引号:
awk -F'\t' 'NR==1 {  for(i=1;i<=NF;i++) { names[i] = $i }; next } { for(i=1;i<=NF;i++) {gsub(/^"|"$/,"",$i); print $i >> names[i] }}' example.tsv

公众号