Shell 在Unix中,如何基于分隔符将文件拆分为多个文件,并删除分隔符

Shell 在Unix中,如何基于分隔符将文件拆分为多个文件,并删除分隔符,shell,unix,Shell,Unix,我有一个文件看起来像这样: {1:F195}{2:O5350646}{3:{1028:076}}{4: :16R:GL :16R:ADD :19A::P//U9,1 :16S:AFO -}{5:{MAC:00}{CHK:1C}}{S:{SAC:}{COP:S}{MAN:P2}}${1:33339}{2:O53}{4: :16S:G :16R:A :19A::H0, :19A::H0, :16S:ADDINFO -}{5:{MAC:0}{CHK:4}}{S:{SAC:}{COP:S}{MAN:GP

我有一个文件看起来像这样:

{1:F195}{2:O5350646}{3:{1028:076}}{4:
:16R:GL
:16R:ADD
:19A::P//U9,1
:16S:AFO
-}{5:{MAC:00}{CHK:1C}}{S:{SAC:}{COP:S}{MAN:P2}}${1:33339}{2:O53}{4:
:16S:G
:16R:A
:19A::H0,
:19A::H0,
:16S:ADDINFO
-}{5:{MAC:0}{CHK:4}}{S:{SAC:}{COP:S}{MAN:GP2}}
现在,我想根据分隔符$将这个文件拆分为两个文件,然后删除分隔符。如有任何帮助,将不胜感激:

我使用了以下逻辑:

首先,每次出现$时,转到一个新行。 我可以创建多个文件,但这些文件都有分隔符。 代码:


使用awk,它有一个专用的输入记录分隔符变量

awk -v RS='$' '{ outfile = "output_file_" NR; print > outfile}' filename      

该程序将每一行打印到一个单独的文件中,行号作为后缀output\u file\u 1、output\u file\u 2。

使用awk,它有一个专用的输入记录分隔符变量

awk -v RS='$' '{ outfile = "output_file_" NR; print > outfile}' filename      

这个程序将每一行打印到一个单独的文件中,行号作为后缀output\u file\u 1,output\u file\u 2。

我想你可能想重新发明轮子。awk是一个很好的工具,可以用来分割分隔符上的文件并执行其他文本处理。您可以尝试以下方法:

awk '{ for(i=1;i<=NF;i++) print $i > "file_" i ".txt" }' RS= FS='\\$' file
文件_2.txt的内容:

说明:


将记录分隔符设置为null,默认情况下将awk设置为“段落模式”,RS设置为\n,从而启用逐行处理。因为您的文件看起来不像包含段落,所以这实际上会将您的文件视为单个记录。然后,我们将字段分隔符设置为需要转义的美元符号字符。所以对于每个记录,应该只有一个记录,我们在每个字段上循环,NF是字段数的缩写,并使用迭代器将其打印到文件中。值得注意的是,如果您的输入包含多个段落,您将得到奇怪的结果。与上面/下面Glenn的答案相比,他的解决方案不会有这个问题,但它处理的最后一个文件将包含一个尾随的换行符。嗯。

我想你可能想重新发明轮子。awk是一个很好的工具,可以用来分割分隔符上的文件并执行其他文本处理。您可以尝试以下方法:

awk '{ for(i=1;i<=NF;i++) print $i > "file_" i ".txt" }' RS= FS='\\$' file
文件_2.txt的内容:

说明:


将记录分隔符设置为null,默认情况下将awk设置为“段落模式”,RS设置为\n,从而启用逐行处理。因为您的文件看起来不像包含段落,所以这实际上会将您的文件视为单个记录。然后,我们将字段分隔符设置为需要转义的美元符号字符。所以对于每个记录,应该只有一个记录,我们在每个字段上循环,NF是字段数的缩写,并使用迭代器将其打印到文件中。值得注意的是,如果您的输入包含多个段落,您将得到奇怪的结果。与上面/下面Glenn的答案相比,他的解决方案不会有这个问题,但它处理的最后一个文件将包含一个尾随的换行符。HTH.

我尝试了baove逻辑,但问题是我无法删除这些删除器。我尝试了baove逻辑,但问题是我无法删除这些删除器。非常感谢steve的回答。工作得很有魅力。我对shell脚本非常陌生。你能确切地告诉我awk代码在做什么吗?@user2647888:我已经为你添加了一个简短的解释。如果需要更多细节,请告诉我。谢谢非常感谢史蒂夫的回答。工作得很有魅力。我对shell脚本非常陌生。你能确切地告诉我awk代码在做什么吗?@user2647888:我已经为你添加了一个简短的解释。如果需要更多细节,请告诉我。谢谢
{1:33339}{2:O53}{4:
:16S:G
:16R:A
:19A::H0,
:19A::H0,
:16S:ADDINFO
-}{5:{MAC:0}{CHK:4}}{S:{SAC:}{COP:S}{MAN:GP2}}