2014-02-11 59 views
2

我有一個文件,它有點類似於:如何文件分割成多個文件基於一個分隔符,並刪除分隔符,在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. 我可以創建多個文件,但那些文件是有分隔符的。

代碼:

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

我試過了,但問題是我不能刪除這些delimeters – user2647888

回答

1

我想你可能會試圖重新發明輪子。 awk是一個很棒的工具,可以用來在分隔符上分割文件並執行其他文本處理。你可能想嘗試以下操作:

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

結果:file_1.txt

內容:的file_2.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}} 

內容:

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

+0

非常感謝您的答案。像魅力一樣工作。我對shell腳本非常陌生,你可以準確地知道awk代碼在做什麼。 – user2647888

+1

@ user2647888:我爲您添加了一個簡要說明。請讓我知道是否需要更多細節。謝謝! – Steve

2

用AWK,它有一個專用的「輸入記錄分隔符」可變

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

這個程序打印每行與行號作爲一個單獨的文件後綴(「output_file_1」,「output_file_2」)。

+0

非常感謝您的回答 – user2647888

相關問題