【问题标题】:Bash - Convert Single Column File into 5 Column Table [duplicate]Bash - 将单列文件转换为 5 列表 [重复]
【发布时间】:2018-04-04 23:36:40
【问题描述】:

我需要将 5 个连续的行转换为列,以便执行排序和比较操作。如何将输入文件转换为 5 列和 X 行的表?最好使用 AWK :)

输入文件

/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_ATLNGAMQO1ZSADDTNINF^1-A-1-O1 */
ALPSGA_ATLNGA_0 {
    srlg-value 1000;
    srlg-cost 10000;
}
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_MACNGAHRO1ZRDCDTNINF^1-A-1-O1 */
ALPSGA_MACNGA_0 {
    srlg-value 2000;
    srlg-cost 10000;
}
/* ALPSGAAKO1ZRDCDTNINF^1-A-1-O1_NSVNTNJYO1ZILADTNINF^2-A-2-O1 */
ALPSGA_NSVNTN_0 {
    srlg-value 3000;
    srlg-cost 10000;
}

输出文件

/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_ATLNGAMQO1ZSADDTNINF^1-A-1-O1 */   ALPSGA_ATLNGA_0 {       srlg-value 1000;        srlg-cost 10000;    }
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_MACNGAHRO1ZRDCDTNINF^1-A-1-O1 */   ALPSGA_MACNGA_0 {       srlg-value 2000;        srlg-cost 10000;    }
/* ALPSGAAKO1ZRDCDTNINF^1-A-1-O1_NSVNTNJYO1ZILADTNINF^2-A-2-O1 */   ALPSGA_NSVNTN_0 {       srlg-value 3000;        srlg-cost 10000;    }

【问题讨论】:

  • 你自己尝试了什么?
  • 您应该能够根据需要对线条进行rs(重塑)——但这更像是Super User 的答案,而不是Stack Overflow(编程)的答案。

标签: bash awk


【解决方案1】:

使用 awk:

$ awk 'BEGIN{RS=ORS="}\n";FS="\n";OFS=" "}{$1=$1;print}' file
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_ATLNGAMQO1ZSADDTNINF^1-A-1-O1 */ ALPSGA_ATLNGA_0 {     srlg-value 1000;     srlg-cost 10000; }
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_MACNGAHRO1ZRDCDTNINF^1-A-1-O1 */ ALPSGA_MACNGA_0 {     srlg-value 2000;     srlg-cost 10000; }
/* ALPSGAAKO1ZRDCDTNINF^1-A-1-O1_NSVNTNJYO1ZILADTNINF^2-A-2-O1 */ ALPSGA_NSVNTN_0 {     srlg-value 3000;     srlg-cost 10000; }

解释:

awk '
BEGIN{
    RS=ORS="}\n"  # set record separators appropriately
    FS="\n"       # field separator is a newline
    OFS=" "       # output field separator is a space
}
{
    $1=$1         # rebuild record
    print         # output
}' file

【讨论】:

    【解决方案2】:

    这是一个使用 AWK 的直接解决方案:对于每一行,再阅读 4 行并打印。

    {
        printf "%s", $0  # Print the first line
    
        # Get the next 4 lines and print
        for (i=0; i < 4; i++) {
            getline
            printf " %s", $0
        }
        printf "\n"  # Finally, print a new line
    }
    

    讨论

    • 我使用了printf,它不会在输出中添加新行
    • 输出当前行后,读取下4行并打印

    【讨论】:

      【解决方案3】:

      关注awk 也可能对您有所帮助。

      awk '{ORS=$0~/^}/?"\n":FS;print}'  Input_file
      

      awk '{ORS=$0~/^}/?"\n":FS} 1'  Input_file
      

      【讨论】:

        【解决方案4】:

        由于我没有在这里看到我的第一个想法,我觉得我必须做出贡献。 (我喜欢@james-brown 的方法,但我通常不会从考虑记录和字段分隔符开始。)

        awk '{ emit=emit $0 " " } /^}$/ { print emit; emit="" }'
        

        基本方法:始终将行附加到emit 变量上,并在最后一行附加为“}”时发出并清除emit 变量。

        上面的代码会在它的输出中添加一个尾随空格,并且它的正则表达式被编码为对第五行非常敏感,它只是一行中的一个'}'字符。

        也许不那么聪明;也许更具可读性。

        【讨论】:

          猜你喜欢
          • 2018-10-25
          • 1970-01-01
          • 2015-07-29
          • 2014-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-11
          相关资源
          最近更新 更多