我有一个看起来像这样的文件:
{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}}
现在我想根据分隔符$
将此单个文件拆分为两个文件,然后再删除分隔符。任何帮助将不胜感激:)
我使用了以下逻辑:
$
时都会转到新行。代码:
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;
答案 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。