1

次のようにコンソールにデータを出力しました。

A B C D E
1 2 3 4 5

私はそれを操作したいのでA:1 B:2 C:3 D:4 E:5印刷されます。

それについて行く最善の方法は何ですか?2 行をトークン化し、配列を使用して出力する必要がありますか?

どうすればbashでそれを行うことができますか?

4

4 に答える 4

1

awkはこれに適しています。

awk 'NR==1{for(i=0;i<NF;i++){row[i]=$i}} NR==2{for(i=0;i<NF;i++){printf "%s:%s",row[i],$i}}' oldfile > newfile

スクリプトのもう少し読みやすいバージョン:

#!/usr/bin/awk -f

NR == 1 {
    for(i = 0; i < NF; i++) {
        first_row[i] = $i
    }
}
NR == 2 {
    for(i = 0; i < NF; i++) {
        printf "%s:%s", first_row[i], $i
    }
    print ""
}

垂直方向にスケーリングする場合は、方法を指定する必要があります。

于 2012-04-18T23:29:47.070 に答える
0

Perl ワンライナー:

perl -lane 'if($.%2){@k=@F}else{print join" ",map{"$k[$_]:$F[$_]"}0..$#F}'

やや読みやすいバージョン:

#!/usr/bin/perl 
my @keys;
while (<>) {
  chomp;
  if ($. % 2) {  # odd lines are keys
     @keys = split ' ', $_;
  } else { # even lines are values
     my @values = split ' ', $_;
     print join ' ', map { "$keys[$_]:$values[$_]" } 0..$#values;
  }
}
于 2012-04-19T01:15:18.143 に答える
0

これはあなたのために働くかもしれません:

echo -e "A B C D E FFF GGG\n1 2 3 4 5 666 7" |
sed 's/ \|$/:/g;N;:a;s/\([^:]*:\)\([^\n]*\)\n\([^: ]\+ *\)/\2\1\3\n/;ta;s/\n//'
A:1 B:2 C:3 D:4 E:5 FFF:666 GGG:7
于 2012-04-19T00:29:48.380 に答える
0

任意の数の要素を持つ 2 行の場合:

(read LINE;
 LINE_ONE=($LINE);
 read LINE;
 LINE_TWO=($LINE);
 for i in `seq 0 $((${#LINE_ONE[@]} - 1))`;
 do
     echo ${LINE_ONE[$i]}:${LINE_TWO[$i]};
 done)

行のペアを実行するには、ループでラップするだけです。

于 2012-04-18T23:15:41.120 に答える