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

时间:2014-02-11 21:45:59

标签: 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:GP2}}

现在我想根据分隔符$将此单个文件拆分为两个文件,然后再删除分隔符。任何帮助将不胜感激:)

我使用了以下逻辑:

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

    FILE=test.dat
    sed 's/\$/\n&/g' $FILE > Inter_$FILE 
    FILE=Inter_$FILE
    
    cat $FILE | while read line
    do
                sleep 1
                FormattedDate=`date +%Y%m%d%H%M%S`
                Final_FILE=New_${FormattedDate}_$FILE
    
                echo "line --- $line"
                echo "FormattedDate --- $FormattedDate"
                Line_Check=`echo $line | tr '$' '@' |  cut -c1`
                ##Line_Check=`sed -e 's/\$/@/g' $line |  cut -c1`
                echo "Line_Check --- $Line_Check"
                echo "Final_FILE --- $Final_FILE"
    
                if [ "$Line_Check" = "@" ]
                then
                               Final_FILE=New_$FormattedDate_$FILE
                               FILE=$Final_FILE
    
                               echo "FOUND In  --- $line"
                               echo "FILE  --->>>  $FILE"
    
                else
                               FILE=$Final_FILE
                               echo "FILE  --->>>  $FILE"
                               ###`echo $line |  cut -c2-` >>
                               ###cat $line` >> $FILE
                               ###Filter_Line=`echo $line`
                               ###echo "Filter_Line  --- $Filter_Line"
                fi
    
                echo $line >> $FILE
    
                ###sed 's/^@//' $FILE > 3_$FILE
    
    done
    
    sed 's/^\$//' $FILE >> Final_$FILE;
    

2 个答案:

答案 0 :(得分:2)

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

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

该程序将每一行打印成一个单独的文件,行号作为后缀(“output_file_1”,“output_file_2”)。

答案 1 :(得分:1)

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

awk '{ for(i=1;i<=NF;i++) print $i > "file_" i ".txt" }' RS= FS='\\$' file

结果:

file_1.txt的内容:

{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}}

file_2.txt的内容:

{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置于“段落模式”(默认情况下RS设置为"\n",这将启用逐行处理)。由于您的文件看起来不包含段落,因此这实际上将您的文件视为单个记录。然后,我们将字段分隔符设置为美元符号字符(需要进行转义)。因此,对于每个记录(并且应该只有一个记录),我们遍历每个字段(NF是字段数的缩写)并使用迭代器将其打印到文件中。值得注意的是,如果您的输入包含多个段落,您将得到奇怪的结果。与上面/下面的Glenn的回答相比,他的解决方案不会出现这个问题,但它处理的最后一个文件将包含一个尾随的换行符。 HTH。