Sed Unix-使用regexp命名目标文件,将文件拆分为N个文件

Sed Unix-使用regexp命名目标文件,将文件拆分为N个文件,sed,split,Sed,Split,如何使用行中的前2个字符作为文件名将文件拆分为N个文件 Ex输入文件: AA23409234TEXT BA23201202Other Text AA23509234YADA BA23202202More Text. C1000000000000000000 应生成3个文件: AA.txt AA23409234TEXT AA23509234YADA BA.txt BA23201202Other Text BA23202202More Text. C1.txt C100000000000000

如何使用行中的前2个字符作为文件名将文件拆分为N个文件

Ex输入文件:

AA23409234TEXT
BA23201202Other Text
AA23509234YADA
BA23202202More Text.
C1000000000000000000
应生成3个文件:

AA.txt

AA23409234TEXT
AA23509234YADA
BA.txt

BA23201202Other Text
BA23202202More Text.
C1.txt

C1000000000000000000
我正在考虑使用与此类似的sed脚本

/^(..)/w \1
但它真正做的是创建一个名为“\1”的文件,而不是创建捕获组

有什么想法吗

$ awk '{fname=substr($0, 0, 2); print >>fname}' input.txt


您需要做的第一件事是确定所有文件名:

filenames=$(sed 's/\(..\).*/\1/' listOfStrings.txt | sort | uniq)
然后,遍历这些文件名

for filename in $filenames
do
   sed -n '/^$filename/ p' listOfStrings.txt > $filename.txt
done

我尚未对此进行测试,但我认为它应该可以工作。

您需要做的第一件事是确定所有文件名:

filenames=$(sed 's/\(..\).*/\1/' listOfStrings.txt | sort | uniq)
然后,遍历这些文件名

for filename in $filenames
do
   sed -n '/^$filename/ p' listOfStrings.txt > $filename.txt
done

我还没有对此进行测试,但我认为它应该可以工作。

这可能对您有用:

sed 's/\(..\).*/echo "&" >>\1.txt/' file | sh
或者,如果您有GNU sed:

sed 's/\(..\).*/echo "&" >>\1.txt/e' file

这可能适合您:

sed 's/\(..\).*/echo "&" >>\1.txt/' file | sh
或者,如果您有GNU sed:

sed 's/\(..\).*/echo "&" >>\1.txt/e' file

谢谢你,我做到了。虽然我不得不将第三个参数substr增加到3,因为文件名只有1个字符。4 awk行:这取决于“N”的数量。如果是一个巨大的数字,它可能会产生错误,比如打开的文件太多。使用close可以避免这种情况。但是,对于少量文件,awk行工作没有问题。不过这是一个很好的解决方案。我确实在awk中出现了“打开的文件太多”错误。当然,这是因为我的“生产”问题涉及的字符比3个多得多。@RafaelM您可以在写入文本后关闭该文件。如果前缀再次匹配,则重新打开它。这将比保持打开稍微慢一点。但是如果你确实要写大量的文件…谢谢你做到了。虽然我不得不将第三个参数substr增加到3,因为文件名只有1个字符。4 awk行:这取决于“N”的数量。如果是一个巨大的数字,它可能会产生错误,比如打开的文件太多。使用close可以避免这种情况。但是,对于少量文件,awk行工作没有问题。不过这是一个很好的解决方案。我确实在awk中出现了“打开的文件太多”错误。当然,这是因为我的“生产”问题涉及的字符比3个多得多。@RafaelM您可以在写入文本后关闭该文件。如果前缀再次匹配,则重新打开它。这将比保持打开稍微慢一点。但是,如果您确实需要写入大量文件,则可以使用filename=$grep-o^。。文件名|排序-u。但是,您要多次扫描该文件,因此性能会很慢。您可以使用filenames=$grep-o^。。文件名|排序-u。但是,您要多次扫描该文件,因此性能会很慢。