2014-11-04 56 views
1

的基础上,我试图分裂一个很长的文本文件,它看起来像这样的:分割文本文件并重新命名第一列

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 

有没有简单的方法来做到这一点?

感谢

回答

0

AWK

如果你不想第一列

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

为什么你要启动回声的外部过程?您可以使用'{print $ 0>文件名}' - 正如其他答案之前所示。你举了一个例子,说明它不应该做什么! – hek2mgl 2014-11-05 08:10:38

+0

有没有办法做到这一点 – Hackaholic 2014-11-05 08:20:04

+0

是的,但为什么你认为最严重的?而且这对于shell代码注入来说也是脆弱的(对于零价值)。动态代码创建总是应该小心处理的东西,我看不出为什么它应该在这里使用。 – hek2mgl 2014-11-05 09:43:01

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

它应该是$ 1“TXT”,我不会工作,如果你不使用引号 – bapors 2018-01-19 12:23:30

+0

@bapors感谢您指出。更正了答案。 – nu11p01n73R 2018-01-23 06:15:52

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

您可以使用以下或者通过pipeing输入文本AWK或通过输入文件使用awk参数

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

或使用

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