我正在尝试为第二列中的每个值重复第一列,这需要在新行上。
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
我在这里是正确的轨道还是你会采用另一种方法?提前谢谢。
答案 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