如何使用bash脚本分割包含多个记录的行

时间:2017-06-24 13:42:08

标签: bash awk sed

我有一个以下形式的文件:

Heading1 Heading2 A1 A2 B1 B2 
Heading3 Heading4 A3 A4 B3 B4 C1 C2

每行包含属于相同标题的多个记录。我要做的是将这些记录分开保存它们的标题。在上面的例子中,我想产生以下内容:

Heading1 Heading2 A1 A2
Heading1 Heading2 B1 B2 
Heading3 Heading4 A3 A4
Heading3 Heading4 B3 B4
Heading3 Heading4 C1 C2

我的主要问题是每行的记录数不是恒定的。

编辑:每行有2个标题和N个记录,每个记录用2个字段表示。所以线条长度的一般形式是2 + 2 * N.所以它始终是

4 个答案:

答案 0 :(得分:3)

awk 解决方案:

awk '{ for(i=3;i<=NF;i+=2) print $1,$2,$i,$(i+1) }' file

输出:

Heading1 Heading2 A1 A2
Heading1 Heading2 B1 B2
Heading3 Heading4 A3 A4
Heading3 Heading4 B3 B4
Heading3 Heading4 C1 C2
  • for(i=3;i<=NF;i+=2) - 从第3个开始迭代字段(i+=2 - 迭代成对)

答案 1 :(得分:1)

awk '{for(i=3;i<=NF;i+=2)print $1,$2,$i,$(i+1)}' file

NF是行中的字段数,$i您可以使用带有数字i的字段。

答案 2 :(得分:0)

这是纯粹的bash解决方案:

#!/bin/bash

while read -r; do
    read -r h1 h2 rest <<< "$REPLY"
    while [ -n "$rest" ]; do
        read -r x1 x2 rest <<< "$rest"
        printf '%s %s %s %s\n' "$h1" "$h2" "$x1" "$x2"
    done
done

答案 3 :(得分:0)

使用GNU sed:

sed -E 's/^(([^ ]* ){2})(([^ ]* ){2})/\1\3\n\1/;P;D;' file