2017-03-24 3 views
-1

Ich habe eine Eingabedatei wie folgt aus:Split eine Datei in mutiple Dateien basierend auf bestimmten Muster

Eingabe.txt:

******************************************************************* 
** 
** 
** 
** 
** report ID: COBX COLLIATERAL IN MARGINX MEMO REPORT 
** 
** 
** 
*********************************************************************** 
ehwq 
A 
s 
fdf 
fg 
gfdg 
fgfd 

******************************************************************* 
** 
** 
** 
** 
** REPORT ID : CZXC COLLATREAL ACTVTY BY CRD 
** 
** 
** 
*********************************************************************** 
ain lik 
fklhsdk 
dgfjkdghdfkj 
dgfdjhgkjdf 
fgjhfkjdghfkjd 
fg 
jdfkhgkjdfh 

Als ich das Skript ausführen, sollte die Ausgabe in aufgeteilt werden mehrere Dateien, wie folgt aus:

Datei 1:

******************************************************************* 
** 
** 
** 
** 
** report ID: COBX COLLIATERAL IN MARGINX MEMO REPORT 
** 
** 
** 
*********************************************************************** 
ehwq 
A 
s 
fdf 
fg 
gfdg 
fgfd 

Datei 2:

******************************************************************* 
** 
** 
** 
** 
** REPORT ID : CZXC COLLATREAL ACTVTY BY CRD 
** 
** 
** 
*********************************************************************** 
ain lik 
fklhsdk 
dgfjkdghdfkj 
dgfdjhgkjdf 
fgjhfkjdghfkjd 
fgjdfkhgkjdfh 

Was habe ich versucht:

grep -i "report id" $1 > ./pattern.txt j=head -1 pattern.txt; 
echo "first line is : - $j"; 
count=0; 
name="output"; 
sed -n '2,$p' pattern.txt > pattern_1.txt while read i do count=expr $count + 1; 
line=echo "$i"; 
echo "line is --- $i -- end"; 
sed -n '/'"$j"'/,/'"$line"'/ {/'"$line"'/d;p;}' $1 > ${name}_${count}.txt; 
j=`echo "$line"; 
sed -i '1i\ ************************************************************‌​*******\ **\ **\ **\ ** ' ${name}_${count}.txt; 
done < pattern_1.txt last_pattern=tail -1 pattern.txt`; 
sed -n '/'"$last_pattern"'/,$ {p;}' $1 > ${name}_last.txt; 
sed -i '1i\ ************************************************************‌​*******\ **\ **\ **\ ** ' ${name}_last.txt; 
+0

Was hast du bisher gemacht? Können Sie uns den Code zeigen? – Nitish

+0

Was ist Ihre Frage? ¿ – Jer

+0

Dies wäre ein einfacher Job für 'csplit' ... – twalberg

Antwort

0

Ich denke, dies ist der beste Weg zu gehen, aber ich gehe davon aus wird es eine leere Zeile in der Datei sein Nach jedem Block, wie in dem Beispiel, das Sie gepostet haben:

i=0; 
while read line 
do 
    printf "$line\n" >> splitted_part_${i}.txt 
    if [ $(echo "$line" | grep -e "^[ ]*$" | wc -l) -gt 0 ] 
    then 
      ((i++)) 
    fi 
done <<< "$(cat input.txt)" 

Ich erstelle eine neue Datei jedes Mal, wenn eine neue leere Zeile e ist aufgetaucht. In Ihrem Beispiel Linien 18 und 36 sind leer:

bash-4.1$ grep -n -e "^[ ]*$" input.txt 
18: 
36: 

Hope this für Sie arbeitet. Gib mir Bescheid.

Verwandte Themen