制作或使用分隔符来分隔结果

时间:2014-11-13 15:05:29

标签: bash awk sed tr

我有多个结果的SQL输出:

 1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 0000000000
2963526113
test 7 8 000000001 9
 1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 0000000000
2963526113
test 7 8 000000001 9

问题是如何制作分隔符或其他东西,并将每个第二和第三行连接到第一行,并将每个SQL查询转换为该输出中的一行:

1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 00000000002963526113 test 7 8 000000001 9
1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 00000000002963526113 test 7 8 000000001 9

3 个答案:

答案 0 :(得分:2)

Awk喜欢这些!!

$ awk 'NR%3 == 0{print line;line=""; next} {line = line $0}' test
1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 00000000002963526113
1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 00000000002963526113

它的作用??

  • NR%3 == 0检查记录数NR3的倍数,如果是,则打印line变量的全部内容。重置line行变量,next会使其读取下一条记录

  • {line = line $0}将被排除在NR不是3的倍数,将整行$0复制到line变量

更简单

$ awk '!(NR%3){print line;line=""; next} {line = line $0}' test

答案 1 :(得分:1)

您可以将paste与您要加入的行-一起使用:

paste - - - < file

... | paste - - -

它返回:

I 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 0000000000  2963526113  test 7 8 000000001 9
1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 0000000000   2963526113  test 7 8 000000001 9

如果您需要使用其他分隔符而不是空格,请使用-d:例如,paste -d"|" - - - <file

答案 2 :(得分:1)

使用gnu-awk和自定义RS

awk -v RS='\n[0-9]+ [A-Z]+ [0-9]+' '{gsub(/\n/, "")} NR==1{print; p=RT; next} 
        {gsub(/\n/, "", p); print p $0; p=RT}' file
1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 00000000002963526113test 7 8 000000001 9
1 OI 021 141012 1321 0001242 4S 2 0080004 5 001 00014 6 000001 000000000000016973 6 0529540437 00000000002963526113test 7 8 000000001 9

PS:只要起始字段具有此正则表达式模式,这将适用于以任意行数分类的记录:[0-9]+ [A-Z]+ [0-9]+'