拆分文本文件并在第一列的基础上重命名

时间:2014-11-04 19:52:40

标签: linux bash awk

我正在尝试拆分一个非常长的文本文件,如下所示:

AA1 0.1 0.2 0.3
AA2 0.5 0.6 0.7
AA3 0.5 0.1 0.3

我想将每行保存在一个单独的文本文件中。我知道split命令会执行它以及以下awk命令:awk' {filename = FILENAME NR;打印>文件名;关闭(文件名)}'

但我希望每个下一个文件都在第一列之后命名,如下所示:

AA1.txt
AA2.txt
AA3.txt

有没有简单的方法呢?

由于

4 个答案:

答案 0 :(得分:2)

您可以使用非常简单的awk脚本

awk '{print $0 > $1".txt"}' inputFile

将创建文件

AA1                        
AA2                        
AA3

测试

$ ls AA*
AA1  AA2  AA3

$ cat AA1
AA1 0.1 0.2 0.3
$ cat AA2
AA2 0.5 0.6 0.7
$ cat AA3
AA3 0.5 0.1 0.3

答案 1 :(得分:2)

您可以使用:

awk '{print >> $1".txt"; close($1".txt")}' input.txt

它使用第一列的值($1)加上扩展名“.txt”作为当前行的输出文件的名称。

正如您在问题中已经显示的那样,之后关闭文件是一个好主意,因为大输入文件中第一列中的太多不同值可能导致打开文件描述符太多。


如果你想省略输出中的第一列 - 因为它不会改变 - 你可以使用它:

awk '{for(i=2;i<=NF;i++){printf "%s ", $i >> $1".txt"};printf "\n" >> $1".txt"; close($1".txt")}' input.txt

它从第二列开始迭代每一列,最后添加一行。

答案 2 :(得分:2)

您可以通过将输入文本输入到awk或使用输入文件作为awk的参数来使用以下内容

cat test.txt | awk '{ print $0 > $1.txt }'

awk '{ print $0 > $1.txt }' test.txt

答案 3 :(得分:0)

使用awk

awk '{cmd="echo " $0 ">" $1; system(cmd)}' file

如果你不想要第1列

awk '{cmd="echo " $2" "$3" "$4 ">" $1  ;system(cmd)}' file