【问题标题】:split file into multiple files (by columns)将文件拆分为多个文件(按列)
【发布时间】:2014-07-29 18:12:54
【问题描述】:

我有一个文件 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&lt;=$NM
  • 还有awk '{print $'$i'}' file.txt
  • NM=$(awk 'NR==1{print NF-2}' file.txt) 没有重定向,因为 awk 无论如何都会将参数作为文件读取,并且还使用 $() 代替劣质的反引号。

标签: bash awk split cut


【解决方案1】:
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 name}}' a.txt 更通用。我也想出了这个办法..很好!
  • 我喜欢这个解决方案,因为它在处理大文件时应该更高效,而不是在 for 循环中运行命令的解决方案。奖励:您可以很好地控制写入哪个文件的哪个字段。非常好!
【解决方案2】:

总结一下我的 cmets,我建议这样(未经测试,因为我没有示例文件):

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' ??
  • 你可能想要NR=='$i
  • 我试图做同样的事情,但我无法成功使用该选项var=$(awk 'NR==$'$i'{print $2}' file2.txt)
  • 如果i 为 7,则如果要打印第 7 行,请删除 NR== 之后的 $
【解决方案3】:

使用trsplit 的替代解决方案

< file.txt tr ' ' '\n' | split -nr/200

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

paste -d' ' x* | cmp - file.txt

如果 split 正在写入带有 x 前缀的文件,则验证它是否有效。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2013-08-24
    • 2015-08-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多