展开一列,同时保留另一列

时间:2014-06-04 15:29:53

标签: text awk

我正在尝试为第二列中的每个值重复第一列,这需要在新行上。

cat ToExpand.txt

Pete    horse;cat;dog
Claire  car
John    house;garden

我的第一次尝试:

cat expand.awk

BEGIN {
        FS="\t"
        RS=";"
}
{
        print $1 "\t" $2
}

awk -f expand.awk ToExpand.txt

Pete    horse
cat
dog
Claire  car
John
garden

所需的输出是:

Pete    horse
Pete    cat
Pete    dog
Claire  car
John    house
John    garden

我在这里是正确的轨道还是你会采用另一种方法?提前谢谢。

2 个答案:

答案 0 :(得分:3)

您还可以将FS值更改为正则表达式并执行以下操作:

awk -F"\t|;" -v OFS="\t" '{for(i=2;i<=NF;i++) print $1, $i}' ToExpand.txt
Pete    horse
Pete    cat
Pete    dog
Claire  car
John    house
John    garden

我假设:

  • 第一个标签是名称
  • 的分隔符
  • 只有一个制表符分隔符 - 如果;部分使用fedorqui的实现后出现制表符分隔数据。

它使用另一种形式设置OFS值(使用-v标志)并在第一个字段之后循环打印预期输出。

您可以将示例中的RS视为从数据中创建“行”(记录确实),并且您的打印块正在处理那些“行”(记录)而不是正常的换行符。然后,您的FS会进一步解析每条记录。这就是你第一次尝试输出的原因。您可以通过在示例中打印出NF的值来探索它。

答案 1 :(得分:0)

尝试:

awk '{gsub(/;/,ORS $1 OFS)}1' OFS='\t' file

这将使用换行,第一个字段和输出字段分隔符替换分号的每个匹配项。

输出:

Pete    horse
Pete    cat
Pete    dog
Claire  car
John    house
John    garden