AWK - 重新排序行并将它们分成块

时间:2016-04-13 08:53:09

标签: algorithm unix awk

我有一个带有这方面数千行的文件,它将块分为字段6中的“主格”字。每个块,必须分成两个子块,一个用字段的字一个,不包含字母“j”(例如:magasabbikaiké)和另一个包含字母“j”的块(例如:magasabbikjaiké)

magasabbikaiké  /j/aiké plural  3pl singular    nominative
magasabbikjaiké /j/aiké plural  3pl singular    nominative
magasabbikaikét /j/aikét    plural  3pl singular    accusative
magasabbikjaikét    /j/aikét    plural  3pl singular    accusative
magasabbikaikénak   /j/aikénak  plural  3pl singular    dative
magasabbikjaikénak  /j/aikénak  plural  3pl singular    dative
magasabbikaikéval   /j/aikéval  plural  3pl singular    instrumental
magasabbikjaikéval  /j/aikéval  plural  3pl singular    instrumental
magasabbikaikéért   /j/aikéért  plural  3pl singular    causal-final
magasabbikjaikéért  /j/aikéért  plural  3pl singular    causal-final
magasabbikaikévá    /j/aikévá   plural  3pl singular    translative
magasabbikjaikévá   /j/aikévá   plural  3pl singular    translative
magasabbikaikéig    /j/aikéig   plural  3pl singular    terminative
magasabbikjaikéig   /j/aikéig   plural  3pl singular    terminative
magasabbikaikéban   /j/aikéban  plural  3pl singular    inessive
magasabbikjaikéban  /j/aikéban  plural  3pl singular    inessive
magasabbikaikén /j/aikén    plural  3pl singular    superessive
magasabbikjaikén    /j/aikén    plural  3pl singular    superessive
magasabbikaikénál   /j/aikénál  plural  3pl singular    adessive
magasabbikjaikénál  /j/aikénál  plural  3pl singular    adessive
magasabbikaikéba    /j/aikéba   plural  3pl singular    illative
magasabbikjaikéba   /j/aikéba   plural  3pl singular    illative
magasabbikaikéra    /j/aikéra   plural  3pl singular    sublative
magasabbikjaikéra   /j/aikéra   plural  3pl singular    sublative
magasabbikaikéhoz   /j/aikéhoz  plural  3pl singular    allative
magasabbikjaikéhoz  /j/aikéhoz  plural  3pl singular    allative
magasabbikaikéból   /j/aikéból  plural  3pl singular    elative
magasabbikjaikéból  /j/aikéból  plural  3pl singular    elative
magasabbikaikéról   /j/aikéról  plural  3pl singular    delative
magasabbikjaikéról  /j/aikéról  plural  3pl singular    delative
magasabbikaikétól   /j/aikétól  plural  3pl singular    ablative
magasabbikjaikétól  /j/aikétól  plural  3pl singular    ablative
magasabbikaikéi /j/aikéi    plural  3pl plural  nominative
magasabbikjaikéi    /j/aikéi    plural  3pl plural  nominative
magasabbikaikéit    /j/aikéit   plural  3pl plural  accusative
magasabbikjaikéit   /j/aikéit   plural  3pl plural  accusative
....

期望的输出:

magasabbikaiké  /j/aiké plural  3pl singular    nominative
magasabbikaikét /j/aikét    plural  3pl singular    accusative
magasabbikaikénak   /j/aikénak  plural  3pl singular    dative
magasabbikaikéval   /j/aikéval  plural  3pl singular    instrumental
magasabbikaikéért   /j/aikéért  plural  3pl singular    causal-final
magasabbikaikévá    /j/aikévá   plural  3pl singular    translative
magasabbikaikéig    /j/aikéig   plural  3pl singular    terminative
magasabbikaikéban   /j/aikéban  plural  3pl singular    inessive
magasabbikaikén /j/aikén    plural  3pl singular    superessive
magasabbikaikénál   /j/aikénál  plural  3pl singular    adessive
magasabbikaikéba    /j/aikéba   plural  3pl singular    illative
magasabbikaikéra    /j/aikéra   plural  3pl singular    sublative
magasabbikaikéhoz   /j/aikéhoz  plural  3pl singular    allative
magasabbikaikéból   /j/aikéból  plural  3pl singular    elative
magasabbikaikéról   /j/aikéról  plural  3pl singular    delative
magasabbikaikétól   /j/aikétól  plural  3pl singular    ablative

magasabbikjaiké /j/aiké plural  3pl singular    nominative
magasabbikjaikét    /j/aikét    plural  3pl singular    accusative
magasabbikjaikénak  /j/aikénak  plural  3pl singular    dative
magasabbikjaikéval  /j/aikéval  plural  3pl singular    instrumental
magasabbikjaikéért  /j/aikéért  plural  3pl singular    causal-final
magasabbikjaikévá   /j/aikévá   plural  3pl singular    translative
magasabbikjaikéig   /j/aikéig   plural  3pl singular    terminative
magasabbikjaikéban  /j/aikéban  plural  3pl singular    inessive
magasabbikjaikén    /j/aikén    plural  3pl singular    superessive
magasabbikjaikénál  /j/aikénál  plural  3pl singular    adessive
magasabbikjaikéba   /j/aikéba   plural  3pl singular    illative
magasabbikjaikéra   /j/aikéra   plural  3pl singular    sublative
magasabbikjaikéhoz  /j/aikéhoz  plural  3pl singular    allative
magasabbikjaikéból  /j/aikéból  plural  3pl singular    elative
magasabbikjaikéról  /j/aikéról  plural  3pl singular    delative
magasabbikjaikétól  /j/aikétól  plural  3pl singular    ablative

magasabbikaikéi /j/aikéi    plural  3pl plural  nominative
magasabbikaikéit    /j/aikéit   plural  3pl plural  accusative
....

magasabbikjaikéi    /j/aikéi    plural  3pl plural  nominative
magasabbikjaikéit   /j/aikéit   plural  3pl plural  accusative
....

我做了什么:

BEGIN {
    FS="\t";
}
{
    id="nominative"
    if ($6 != id)
    {
        split(line_3,A,"\n")

        if (match($1,"j")==0)
        {
            line_1=line_1 $0"\n";
        }
        else
        {
            line_2=line_2 $0"\n";
        }
        line_3="";
    }
    else
    {
        line_3=line_3 $0"\n";
        print A[1]"\n"line_1;
        print A[2]"\n"line_2;

        line_1="";
        line_2="";
    }
}

1 个答案:

答案 0 :(得分:0)

目前还不是很清楚你想要实现什么,但我认为你想要这个:

  • 您的文件有块。这些块以标记为“主格”的行开头,但可能有几个连续的“主格”条目属于同一个块。每个块还包含其他条目和其他案例。
  • 每个块内部是带有j的单词和没有j的单词。您希望为每个单词类为每个块创建两个子块。
  • 您想打印出由空格分隔的子块。数据没有改变,只是重新排列。

我认为您可以立即打印条目而不用j,并使用j在临时字符串中保存条目。跟踪当前行和上一行是否为主格。如果当前行是主格而前一行不是,则刷新并重置临时字符串。

第一行之前的行被人为地设置为非主格。您还必须在末尾刷新临时字符串。

BEGIN {
    FS = "\t";
    id = "nominative";

    prev = 0;                       # was last line "nominative"?
    withj = "";                     # temporary string for words with j
}

{
    curr = ($6 == id)               # is this line "nominative"?

    if (curr && !prev) {            # begin a new block
        print "";

        if (withj) {
            print withj;
            print "";
        }

        withj = "";
    } 

    if (match($1, "j")) {           # separate j and non-j
        withj = withj $0 "\n";
    } else {
        print;
    }

    prev = curr;
}

END {
    print "";                       # flush everything at the end
    print withj;
    print "";
}