尴尬:将孤儿的文本合并到上面行中的特定字段



给定一个包含项目信息的选项卡 - 删除文本文件:

41850 0.4 0.5 lg en rp Billy制作了冰箱朋友9338 0.4 0.5 LG EN RP Shine,音乐剧!芥末,上校7255 0.5 0.5 0.5 lg en rp你可以玩杜鲁门,哈丽雅特犹太人的竖琴9314 0.5 0.5 0.5 lg en rp HI,Skippy Plum,教授

注意两条线上的"孤立"标题。使用Awk,我该如何将这个孤儿合并回上面的标题字段?

伪 - 沃克:

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

无论如何,这些步骤似乎是:

  • 找到"正常"线,
  • 测试以下行是"孤儿"
  • 如果是这样,请将"孤儿"附加到字段7 [标题字段],
  • 印刷线

  • 找到"孤儿"
  • 以某种方式附加到上一行的7(永远不会有两个连续的孤儿)

对我来说,第一种方法似乎最容易 - 但是,我在这里无知的人。

这可能对您有用(gnu sed):

sed '$!N;/n([^t]*t){7}/!s/(t[^t]*)n(.*)/ 21/;P;D' file
$ 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()呼叫或匹配(),或者如果您不想使用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

我意识到这个问题是标记为 awk,但这可能是使用perl更容易的时间之一:

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

尽管这是同一想法的尴尬版本(通过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

最新更新