根据特定列中的修改拆分表文件

时间:2012-09-13 17:55:25

标签: awk split gnu

我有这种表:

classA, s1, ss1
classA, s1, ss2
classA, s2, ss1
classB, s1, ss1
classB, s1, ss2
classC, s1, ss1
classC, s2, ss1
classC, s2, ss2

根据第1列中的连续值,我想分成3个名为“classA”,“classB”和“classC”的文件。我首先尝试使用csplit找到一种方法,但它似乎仅适用于指定的模式,而不是模式更改时。有没有awk方式或任何其他命令行工具呢?

[UPDATE] 我的第一列中也有一些斜线导致了这个错误,例如:

classA, s1, ss1
classA, s1, ss2
classA, s2, ss1
classB, s1, ss1
classB, s1, ss2
classC, s1, ss1
classC, s2, ss1
classC, s2, ss2
classA/classA.1/classA.2, s1, ss1
classA/classA.1/classA.2, s1, ss2

当我运行命令时:

awk -F, '{ print $0 > $1}' infile

它一直工作到“classC”但后来我有这个错误,因为我猜它将“/”解释为路径:

fatal: can't redirect to `classA/classA.1/classA.2' (No such file or directory)

1 个答案:

答案 0 :(得分:3)

awk -F, '{ print $0 > $1}' infile 

<强>输出

-rw-r--r-- 1 shellter root  48 Sep 13 14:01 classC
-rw-r--r-- 1 shellter root  32 Sep 13 14:01 classB
-rw-r--r-- 1 shellter root  48 Sep 13 14:01 classA

其中$ 1有“/.../path/info,试试

awk -F, '{ outFile="$1"; gsub(/\//, "", outFile); print $0 > outFile }' infile

如果您不执行gsub(),则任何'/'字符都将被设置为遵循创建输出文件的路径。当然,指定的路径需要存在,否则您将收到错误消息。

请注意,有些awk喜欢使用{/ 1}}这样的'/'字符,或者您甚至可能需要gsub(/[\/]/,"", fileName)作为搜索目标。

IHTH