2

我有这种表:

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

根据第一列中的连续值,我想将其拆分为 3 个名为“classA”、“classB”和“classC”的文件。我首先尝试找到一种使用 csplit 的方法,但它似乎只适用于指定的模式,而不是模式改变时。是否有任何 awk 方式或任何其他命令行工具可以做到这一点?

[更新] 我的第一列中还有一些导致该错误的斜线,例如:

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

1 回答 1

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 更喜欢使用 '/' 字符gsub(/[\/]/,"", fileName),或者您甚至可能需要[\\/]将其作为搜索目标。

IHTH

于 2012-09-13T18:00:02.573 回答