2013-08-23 15 views
2

我有以下格式的文件:在文本文件中如何連接的話

B: that 


I: White 


I: House 


B: the 
I: emergency 


I: rooms 


B: trauma 
I: centers 

我需要做的是從頂部逐行讀取,如果符合B,則除去乙開始: 如果以I開頭:然後刪除I:並連接到前一個(前一個按照相同的規則處理)。

預期輸出:

that White House 
the emergency rooms 
trauma centers 

我試了一下:

while read line 
do 
    string=$line 

    echo $string | grep "B:" 1>/dev/null 
    if [ `echo $?` -eq 0 ] //if start with " B: " 
    then 
     $newstring= echo ${var:4} //cut first 4 characters which including B: and space 

     echo $string | grep "I:" 1>/dev/null 
    if [ `echo $?` -eq 0 ] //if start with " I: " 
    then 
     $newstring= echo ${var:4} //cut first 4 characters which including I: and space 
done < file.txt 

什麼我不知道的是如何把它回線(在文件中),以及如何連接行到以前處理過的一個。

回答

0

使用awk打印I:B:記錄的第二個字段。變量first用於控制換行輸出。

/B:/搜索B:模式。這種模式標誌着記錄的開始。如果記錄不是第一個,則打印換行符,然後打印數據$ 2。 。

如果找到該模式是I:數據$ 2(打印隨後I:第二場

awk 'BEGIN{first=1} 
    /B:/ { if (first) first=0; else print ""; printf("%s ", $2); } 
    /I:/ { printf("%s ", $2) } 
    END {print ""}' filename 
+0

是的,它的工作原理!這也是非常好的和簡短的答案,如果有關於參數的評論,會是完美的! – user1314404

+0

增加了一些更多的敘述 - 希望有所幫助。 – suspectus

0
awk -F":" '{a[NR]=$0} 
      /^ B:/{print line;line=$2} 
      /^ I:/{line=line" "$2} 
      END{ 
       if(a[NR]!~/^B/) 
       {print line} 
      }' Your_file 
0

這可能會爲你工作(GNU SED):

sed -r ':a;$!N;s/\n$//;s/\n\s*I://;ta;s/B://g;s/^\s*//;P;D' file 

或:

sed -e ':a' -e '$!N' -e 's/\n$//' -e 's/\n\s*I://' -e 'ta' -e 's/B://g' -e 's/^\s*//' -e 'P' -e 'D' file 
+0

我使用Mac,它說:sed:非法選項 - r – user1314404

+0

@ user1314404它不需要'-r'選項,但是當您使用Mac時,您可能需要分隔每條指令並使用'-e'旗。請參閱編輯 – potong

0
awk '/^B/ {printf "\n%s",$2} /^I/ {printf " %s",$2}' file 

that White House 
the emergency rooms 
trauma centers 

縮短一些

awk '/./ {printf /^B/?"\n%s":" %s",$2}' file 
+0

謝謝,如果允許接受兩個答案,我會選擇你。但我必須得到最快的答案。 – user1314404

+0

沒問題,你仍然可以點擊向上箭頭(這個回答很有用):) – Jotne

0

有一個有趣的解決方案,在RS模式上使用awk自動分割。請注意,這是在輸入格式變化的有點敏感:

<infile awk 1 RS='(^|\n)B: ' | awk 1 RS='\n+I: ' ORS=' ' | grep -v '^ *$' 

輸出:

that White House 
the emergency rooms 
trauma centers 

這個工程至少是GNU AWK和AWK汗衫。

相關問題