Bash - 将单列文件转换为5列表

时间:2018-04-04 14:56:49

标签: bash awk

我需要将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;    }

4 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:1)

这是一个使用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并打印

答案 2 :(得分:1)

关注awk也可以帮助您。

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

<强> OR

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

答案 3 :(得分:1)

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

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

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

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

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