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

4

我有一个名为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

有什么建议吗?编辑:非常感谢你们所有人。所有的答案都是有价值的,但我无法对所有答案投票。

可能是 for... i<=$NM - Mark Setchell
awk '{print $'$i'}' file.txt - Mark Setchell
而且,使用$()代替不太好的反引号,并且不需要重定向,因为awk无论如何都会将参数读取为文件。NM=$(awk 'NR==1{print NF-2}' file.txt) - Mark Setchell
3个回答

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

awk '{for(i=1;i<=NF;i++){name=FILENAME"_"i;print $i> name}}' a.txt 变得更通用。我也想出了这种方法..很好! - Devesh
我喜欢这个解决方案,因为它在处理大文件时应该更有效率,而不是在for循环中运行命令的解决方案。额外加分:你可以对写入哪个文件的哪个字段进行精细控制。非常好! - pawamoy

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

有没有可能用NR=$'$i'这样的方式做同样的事情? - shadraws
你可能想要使用 NR=='$i - Mark Setchell
我也试图做同样的事情,但是我用那个选项没有成功。 var=$(awk 'NR==$'$i'{print $2}' file2.txt) - shadraws
如果您想在i为7时打印第7行,则在NR==后面删除$ - Mark Setchell

1
一种使用trsplit的替代解决方案。
< file.txt tr ' ' '\n' | split -nr/200

假设该文件以空格为分隔符,但 tr 命令可以根据任何分隔符进行调整。基本上,这将每个条目放在自己的一行上,然后使用 split 的轮换版本将每第200行写入同一个文件中。
paste -d' ' x* | cmp - file.txt

如果split使用x前缀编写文件,就可以验证它的工作。

我从coreutils邮件列表中的Reuti那里得到了这个解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接