2

次の 2 つのファイルがあります。

ファイルf1には次の構造があります (# の後はファイルにないコメントです)

SomeText1                #Section name - one word [a-zA-Z]
acd:some text            #code:text - the code contains only [a-z]
opo:some another text    #variable number of code:text pairs
wed:text too             #in the SomeText1 section are 3 pairs
SomeText2
xxx:textttt              #here only 1 code:text pair
SomeText3
zzz:texxxxxxx            #here only 1 code:text pair too

f2上記のファイルと同じ順序で次の行を含むものをファイルします。

1000:acd:opo:wed:123.44:4545.23:1233.23    #3 codes - like in the above segment 1
304:xxx:10:11:12.12                        #1 code - these lines contains only 
4654:zzz:0                                 #codes and numbers

望ましい出力は

SomeText1:1000:acd:opo:wed:123.44:4545.23:1233.23
acd:some text:
opo:some another text:
wed:text too:
SomeText2:304:xxx:10:11:12
xxx:textttt:
SomeText3:4654:zzz:0
zzz:texxxxxxx:

f2したがって、 「セクション名」行から行を追加する必要があります。f2ファイル内のすべての行のコードは、f1

始め方がわからないので

  • paste両方のファイルの行数が同じでないため、コマンドを使用できません。
  • joinは両方のファイルで共通のキーではないため、使用できません。

だから、誰かが私に SOME ALGORITHM を教えてくれたら、本当にうれしいです。

4

2 に答える 2

3

私はあなたに別のアプローチを提供しています-私はコードを提供します、そしてあなたはそれがどのように機能するかを理解する必要があります;) :)

paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)

入力から必要なものを正確に生成します。

編集 - 説明:

  • ソウルションはあなたのコメントから来ています。行にはコードと数字のみが含まれています。したがって、回線から簡単にコードを取得できます。
  • したがって、各行の後にできるだけ多くの空行を入力してください - あなたが持っているコードの数
  • /[a-z]+/g一致したすべてをcode返し、それらを返します
  • これ$c =()=は「Rolex operator」です - 一致のリストをカウントできるもの
  • 一致したコードの数は、必要な空行の数を示します
  • -つまり$\ = "\n" x NUMBER、`x の前の文字列を NUMBER 回繰り返すことを意味します。たとえば、3 つのコードがある場合、"\n" (改行) 文字が 3 回繰り返されます。
  • 改行が変数$\- 出力レコード sep に追加されます。
  • また、-pスイッチはファイルを行ごとに処理し、すべての行を「print $_$\;」の形式で出力するためです。- したがって、すべての行の後に出力レコードセパレーターが出力されます - これには多くの改行が含まれます。
  • したがって、空の行が得られます

私の英語が説明に十分だったことを願っています。

于 2013-05-17T23:13:41.757 に答える
1

または完全に Perl で:

my $skip;
while (<$f1>) {
   chomp;
   my $suffix;
   if ($skip--) {
      $suffix = "\n";
   } else {
      $suffix = <$f2>;
      $skip = () = $suffix =~ /[a-z]+/g;
   }

   print "$_:$suffix";
}
于 2013-05-18T02:14:10.247 に答える