2

次の形式のファイルがあります。

B: that


I: White


I: House


B: the
I: emergency


I: rooms


B: trauma
I: centers

私がする必要があるのは、行が B で始まる場合、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

私が知らないのは、それを(ファイル内の)行に戻す方法と、その行を以前に処理された行に接続する方法です。

4

5 に答える 5

0
awk -F":" '{a[NR]=$0}
           /^ B:/{print line;line=$2}
           /^ I:/{line=line" "$2}
           END{
               if(a[NR]!~/^B/)
               {print line}
          }' Your_file
于 2013-08-23T07:06:46.743 に答える
0

awk print を使用してI:B:レコードの 2 番目のフィールドを出力します。変数firstは、改行出力を制御するために使用されます。

/B:/パターンを検索しB:ます。このパターンは、レコードの開始を示します。レコードが最初ではない場合、改行が出力され、データ $2 が出力されます。

見つかったパターンがI:データ $2 の場合 (次の 2 番目のフィールドI:が出力されます。

awk 'BEGIN{first=1}
     /B:/ { if (first) first=0; else  print "";  printf("%s ", $2); }
     /I:/ { printf("%s ", $2) }
     END {print ""}' filename
于 2013-08-23T07:07:16.923 に答える
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
于 2013-08-23T07:45:37.617 に答える
0

RS パターンで awk auto-split を使用した興味深いソリューションがあります。これは、入力形式の変化に少し敏感であることに注意してください。

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

出力:

that White House
the emergency rooms
trauma centers

これは、少なくとも GNU awk と Mikes awk で動作します。

于 2013-08-23T10:14:41.420 に答える