将文件拆分为多个文件(按列)

时间:2014-06-09 08:23:09

标签: bash awk split cut

我有一个文件data.txt,其中有200列和行(方形矩阵)。所以,我一直在尝试将我的文件分成200个文件,每个文件都有一个来自大数据文件的列。这些我的两次尝试使用cut和awk,但我不明白为什么不工作。

NM=`awk 'NR==1{print NF-2}' < file.txt`
echo $NM

for (( i=1; i = $NM; i++ ))
do
echo $i 
cut -f ${i} file.txt > tmpgrid_0${i}.dat
#awk '{print '$i'}'  file.txt > tmpgrid_0${i}.dat
done

有什么建议吗?。

编辑:非常感谢你们所有人。所有答案都有效,但我不能投票给所有答案。

3 个答案:

答案 0 :(得分:5)

awk '{for(i=1;i<=5;i++){name=FILENAME"_"i;print $i> name}}' your_file

测试了5列:

> cat temp
PHE  5  2 4 6
PHE  5  4 6 4
PHE  5  4 2 8
TRP  7  5 5 9
TRP  7  5 7 1
TRP  7  5 7 3
TYR  2  4 4 4
TYR  2  4 4 0
TYR  2  4 5 3
> nawk '{for(i=1;i<=5;i++){name=FILENAME"_"i;print $i> name}}' temp
> ls -1  temp_*
temp_1
temp_2
temp_3
temp_4
temp_5
> cat temp_1
PHE
PHE
PHE
TRP
TRP
TRP
TYR
TYR
TYR
> 

答案 1 :(得分:2)

总结一下我的评论,我建议像这样(未经测试,因为我没有样本文件):

NM=$(awk 'NR==1{print NF-2}' file.txt)
echo $NM

for (( i=1; i <= $NM; i++ ))
do
   echo $i 
   awk '{print $'$i'}'  file.txt > tmpgrid_0${i}.dat
done

答案 2 :(得分:0)

使用trsplit

的替代解决方案
< file.txt tr ' ' '\n' | split -nr/200

这假设文件是​​以空格分隔的,但可以根据任何分隔符调整tr命令。基本上这会将每个条目放在自己的行上,然后使用split的循环版本将每个第200行写入同一个文件。

paste -d' ' x* | cmp - file.txt
如果split正在编写带有x前缀的文件,

验证它是否有效。

我在Coreutils邮件列表上从Reuti获得了这个解决方案。