绘制任务。我有数据框中:bash命令用于将单元格内容按分隔符分隔成单元列中的多行
x y1;y2;y3 z1;z2;z3
a b1;b2 c1;c2
我需要:
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
第1列有一个实例始终。单元格中的实例数可以是1到多个,但在2,3列之间总是相等。由于
绘制任务。我有数据框中:bash命令用于将单元格内容按分隔符分隔成单元列中的多行
x y1;y2;y3 z1;z2;z3
a b1;b2 c1;c2
我需要:
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
第1列有一个实例始终。单元格中的实例数可以是1到多个,但在2,3列之间总是相等。由于
像这样的东西应该让:
declare -a cols=() # array for individual columns (line fields)
IFS=' ;' # fields separators
while read -a cols; do
n=${#cols[@]} # number of fields in current line
if ((n < 3 || n % 2 != 1)); then # skip invalid lines
printf "skipping invalid line: %s\n" "${cols[*]}"
continue
fi
for ((i = 1; i <= n/2; i += 1)); do # loop over pairs of fields
# printf line
printf "%s %s %s\n" "${cols[0]}" "${cols[i]}" "${cols[n/2+i]}"
done
done < data.txt
说明:
IFS
是使用read
将拆分字段行字符的列表。在你的情况下,空间和;
似乎是分隔符。read -a cols
分配读取线的字段到cols
阵列,起始于细胞运行的0.实施例:
$ cat data.txt
x y1;y2;y3 z1;z2;z3
a b1;b2 c1;c2
$ ./foo.sh
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
出错了。我为第1列重复行,但为2和3重复行数。您能否再次检查描述,我澄清了它。 –
我不明白,对不起。我只是复制粘贴我的代码和输入数据,没有任何改变,我得到了您的预期输出:分别以'x'开始,后跟'y1 z1','y2 z2'和'y3 z3'开始的3行。然后2行分别以'a'开头,后面跟着'b1 c1'和'b2 c2'。你是否100%确定你准确地解释了你想要的? –
我编辑了我的答案,以显示我的输出与您的输入相似。你能检查一下自己并解释你看到的与你所期望的有什么不同吗? –
在AWK:
$ awk -F"(\t|;)" '{
for(i=2;i<=4;i++)
if($i!="")
print $1, $i, $(i+3)
}' file
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
编辑:另一个版本:
$ awk -F"(\t+|;)" '{ # FS tabs or semicolon
for(i=2;i<=int(NF/2)+1;i++)
print $1,$i,$(i+int(NF/2))
}' file
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
东西坏了。实例变得混合并且连续的单个实例发生在第一列之后(第三列) –
编辑FS作为问题中更改的样本数据的结果。它改变了什么吗? –
为了清晰起见,我更改了单元格中的分隔符 –