将由`\ n`分隔的垂直矩形转换为水平

时间:2017-06-19 00:51:40

标签: bash awk transpose

我有一个文本文件,其值如下:

a b
c d
e f
g h

i j
k l
m n
o p

q r
s t
u v
w x

我想将\n分隔的垂直线转换为水平线:

a c e g
b d f h

i k m o
j l n p

q s u w
r t v x

我试过这个:

WRD=$(head -n 1 a.txt | wc -w);
for((i=1; i<=$WRD; i++)); do
    awk '{print $'$i'}' a.txt | tr '\n' ' '; echo;
done > "sa.txt"

但是输出看起来像这样:

a c e g  i k m o  q s u w 
b d f h  j l n p  r t v x 

如何根据需要编辑输出?

5 个答案:

答案 0 :(得分:3)

$ awk -v RS= '{
    for (i=1;i<=2;i++) {
        for (j=i;j<=NF;j+=2) {
            printf "%s%s", $j, (j<(NF+i-2)?OFS:ORS)
        }
    }
    print ""
}' file
a c e g
b d f h

i k m o
j l n p

q s u w
r t v x

答案 1 :(得分:2)

击:

while read -r line1; do if [[ -z $line1 ]]; then echo; continue; fi; read -r line2; echo "$line1 $line2"; done < file

并缩进:

while read -r line1; do
  if [[ -z $line1 ]]; then
    echo
    continue
  fi
  read -r line2
  echo "$line1 $line2"
done < file

输出:

a b c d
e f g h

i j k l
m n o p

q r s t
u v w x

答案 2 :(得分:2)

尝试:此解决方案也适用于超过2个字段,(我在这里考虑的唯一事情是你没有任何空字段)。

@media only screen and (max-width: 480px) {
            #wrapper, #main-content, #content, #form{       
                float: left;
                width: 100%;
            }       

}

以上一条内线说明:

awk '/^$/{for(j=1;j<=val;j++){print A[j];delete A[j];};print}{for(i=1;i<=NF;i++){;A[i]=A[i]?A[i] FS $i:$i};val=NF} END{for(j in A){print A[j]}}'   Input_file

答案 3 :(得分:1)

不确定您的数据是否会变得更复杂,但这应该让您开始:

awk 'NF{col1 = col1 (col1?FS:"") $1;col2 = col2 (col2?FS:"") $2;next}{print col1 RS col2;col1=col2=""}END{print col1 RS col2}' input_file

我们使用NF让我们知道包含数据的行并相应地存储它们。

END是必需的,因为在最后一个条目之后没有额外的行。

答案 4 :(得分:1)

  1. 使用sedpaste

    sed '/^$/p' inputfile | paste -d ' ' - -
    

    输出:

    a b c d
    e f g h
    
    i j k l
    m n o p
    
    q r s t
    u v w x
    

    请注意,上述内容可能不符合规范,因为它只适用于 矩形的偶数编号为 2x n ,( 2x4 转换为 4x2 )。 OTOH Cyrus&#39;和grail's 答案也会在不规则的矩形上失败,即如果被喂grep -v '[gx]' inputfile

  2. 使用csplitdatamash进行更一般的修复(适用于任何大小不等的矩形):

    # Create a more irregular input file:
    grep -v '[gx]' inputfile | tee vlines3
    

    输出:

    a b
    c d
    e f
    
    i j
    k l
    m n
    o p
    
    q r
    s t
    u v
    

    代码:

    x=`mktemp -u`
    csplit -f $x --suppress-matched -s vlines3 '/^$/' '{*}'
    for f in ${x}* ; do 
         datamash -W -t' ' transpose < $f
         echo
         rm $f
    done | head -n  -1
    

    输出:

    a c e
    b d f
    
    i k m o
    j l n p
    
    q s u
    r t v