【发布时间】:2016-06-06 16:41:50
【问题描述】:
我有一个包含 500 列的文件,我需要将每一列拆分为一个新文件,同时在所有文件中打印 $1。下面是一个示例文件,我设法使用下面的 bash/awk 解决方案来做到这一点:
ID F1 F2 F4 F4
aa 1 2 3 4
bb 1 2 3 4
cc 1 2 3 4
dd 1 2 3 4
num=('1' '2' '3' '4')
for i in ${num[@]}; do awk -F "\t" -v col="$i" '{print $1,$col}' OFS="\t"
Input.txt > ${i}.txt; done
它给出了所需的输出:
1.txt
ID ID
aa aa
bb bb
cc cc
dd dd
2.txt
ID F1
aa 1
bb 1
cc 1
dd 1
....
但是,我无法跟踪哪个文件对应于哪个列,因为输出文件名是字段编号而不是字段名称。是否可以将字段的标题作为输出文件名的前缀写入?
ID.txt
ID ID
aa aa
bb bb
cc cc
dd dd
F1.txt
ID F1
aa 1
bb 1
cc 1
dd 1
【问题讨论】:
-
原则上,它可以在
awk中一次完成,但是 500 列可能是个问题——您需要至少能够打开 500 个文件才能一次完成(我的ulimit -n默认是256)。您可能需要多次通过(例如第 2-99、100-199、200-299、300-399、400-499 列)或其他任何内容。 -
读取第一行并用作
for循环的索引,用户自己的计数器来计数列