2017-09-06 36 views

回答

0

像这样的东西应该让:

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 
+0

出错了。我为第1列重复行,但为2和3重复行数。您能否再次检查描述,我澄清了它。 –

+0

我不明白,对不起。我只是复制粘贴我的代码和输入数据,没有任何改变,我得到了您的预期输出:分别以'x'开始,后跟'y1 z1','y2 z2'和'y3 z3'开始的3行。然后2行分别以'a'开头,后面跟着'b1 c1'和'b2 c2'。你是否100%确定你准确地解释了你想要的? –

+0

我编辑了我的答案,以显示我的输出与您的输入相似。你能检查一下自己并解释你看到的与你所期望的有什么不同吗? –

0

在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 
+0

东西坏了。实例变得混合并且连续的单个实例发生在第一列之后(第三列) –

+0

编辑FS作为问题中更改的样本数据的结果。它改变了什么吗? –

相关问题