我在控制台中打印出的数据如下:
A B C D E
1 2 3 4 5
我想操纵它以便打印A:1 B:2 C:3 D:4 E:5
。
最好的方法是什么?我应该对这两行进行标记,然后使用数组将其打印出来吗?
我如何在bash中解决这个问题?
答案 0 :(得分: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 ""
}
如果你想让它垂直缩放,你必须说明如何。
答案 1 :(得分:0)
对于包含任意数量元素的两行:
(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)
要做成对的行,只需将其包裹在一个循环中。
答案 2 :(得分: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
答案 3 :(得分:0)
Perl one-liner:
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;
}
}