1

アイテム情報を含むタブ区切りのテキストファイルがある場合:

41850 0.4 0.5 LG EN RPビリーがフリッジウェルを作る、ノルム
友達       
9338 0.4 0.5 LG EN RPシャイン、ミュージカル!マスタード、大佐   
7255 0.5 0.5 LG EN RPトルーマン、ハリエットをプレイできますか
口琴
9314 0.5 0.5 LG EN RPこんにちは、Skippy Plum、教授   

2行の「孤立した」タイトルに注意してください。Awkを使用して、この孤児を上のタイトルフィールドにマージするにはどうすればよいですか?

疑似awk:

awk '/^[[:digit:]]/{getline; ??? 
    if next line ~ /^[[:alpha:]]/ title=$7 + previous
    END{print $0}' <FILE

とにかく、手順は次のようです。

また

  • 「通常の」線を見つけ、
  • 次の行が「孤立」しているかどうかをテストします
  • その場合は、フィールド7[タイトルフィールド]に「孤立」を追加します。
  • 印刷行

また

  • 「孤児」を探す
  • どういうわけか前の行のフィールド7に追加します[2つの連続した孤立は決してありません]

最初の方法は私には最も簡単に思えます---しかし、それでは、私はここで無知な人です。

4

3 に答える 3

2
$ tac file | awk 'BEGIN{FS=OFS="\t"} NF==1{s=" "$0;next} {$7=$7 s; s=""}1' | tac
41850   0.4     0.5     LG      EN      RP      Billy Makes a Friend    Fridgewell, Norm
9338    0.4     0.5     LG      EN      RP      Shine, The Musical!     Mustard, Colonel
7255    0.5     0.5     LG      EN      RP      Can You Play the Jew's Harp     Truman, Harriet
9314    0.5     0.5     LG      EN      RP      Hi, Skippy      Plum, Prof

これは、tacを使用せず、GNU awkを使用する別のアプローチです(gensub()を2つのsub()呼び出しまたはmatch()に置き換えるか、gawkを使用したくない場合は何でも):

$ cat tst.awk
BEGIN { FS="\t" }
NF==1 { s = gensub(/([^\t]+[\t]){6}[^\t]+/, "\\0 "$1, "", s); next }
      { printf "%s",s; s=$0 ORS }
END   { printf "%s",s }

$ gawk -f tst.awk file
41850   0.4     0.5     LG      EN      RP      Billy Makes a Friend    Fridgewell, Norm
9338    0.4     0.5     LG      EN      RP      Shine, The Musical!     Mustard, Colonel
7255    0.5     0.5     LG      EN      RP      Can You Play the Jew's Harp     Truman, Harriet
9314    0.5     0.5     LG      EN      RP      Hi, Skippy      Plum, Prof
于 2012-10-27T05:34:40.930 に答える
2

これはあなたのために働くかもしれません(GNU sed):

sed '$!N;/\n\([^\t]*\t\)\{7\}/!s/\(\t[^\t]*\)\n\(.*\)/ \2\1/;P;D' file
于 2012-10-27T11:47:51.197 に答える
1

質問にタグが付けられていることはawkわかっていますが、これはPerlの方が簡単な場合の1つかもしれません。

perl -F"\t"  -lane 'BEGIN { $, = "\t" } 
            if (/^\d{2}/) { print @saved if @saved; @saved = @F } 
                     else { $saved[6].=" $_" }; 
                      END { print @saved }' foo.txt 

これは同じアイデアのawkバージョンですが(Ed Mortonによるいくつかの改善があります):

awk -F"\t" '/^[0-9][0-9]/  { if (prefix) { print prefix"\t"title"\t"suffix }
                             prefix=$1
                             for ( i=2; i<=6; ++i ) prefix=prefix"\t"$i
                             title=$7; suffix=$8
                             next } 
                           { title = title" "$0 } 
                       END { print prefix"\t"title"\t"suffix }' foo.txt 

どちらのスクリプトも、次のような出力を提供します。

41850   0.4     0.5     LG      EN      RP      Billy Makes a Friend    Fridgewell, Norm 
9338    0.4     0.5     LG      EN      RP      Shine, The Musical!     Mustard, Colonel
7255    0.5     0.5     LG      EN      RP      Can You Play the Jew's Harp     Truman, Harriet
9314    0.5     0.5     LG      EN      RP      Hi, Skippy      Plum, Prof
于 2012-10-27T02:46:02.980 に答える