将awk输出打印到新列

时间:2014-12-12 10:39:19

标签: bash loops awk

我修改了很多文件(过滤后),我需要将NR和关于新文件的字符打印到列中 - 让我们看一下示例:

input files: x1, x2, x3, y1, y2, y3, z1, z2, z3 ...

脚本:

for i in x* y* z*

 do awk -v h=$i 'END{c+=lenght+1 ;print h "\t" NR "\t" c}' >> stats.txt

done;

我的输出如下:

x1 NR c
x2 NR c
x3 NR c
y1 NR c
y2 NR c
y3 NR c
z1 NR c
z2 NR c
z3 NR c

我需要将每个循环保存到新列无行:

x1 NR c y1 NR c z1 NR c

x2 NR c y2 NR c z2 NR c

x3 NR c y3 NR c z3 NR c

在同一行保留相应的文件(过滤后)。我希望我很清楚。我需要在BASH和awk中这样做。谢谢你的帮助!!

编辑:

实际输出如下:

    x   0.457143    872484
    y   0.527778    445759
    z   0.416667    382712
    x   0.457143    502528
    y   0.5         575972
    z   0.444444    590294
    x   0.371429    463939
    y   0.694444    398033
    z   0.56565     656565
    .
    .
    .

我需要:

x 0.457143  872484 0.457143 502528 0.371429 463939
y 0.52777   445759 0.5      575972 0.694444 398033
.
.
.

我希望很清楚......

1 个答案:

答案 0 :(得分:-1)

试试这个:

cat data | tr -d , | awk '{for (i = 1; i <= NF; i += 3) print $i " NR c " $(i+1) " NR c " $(i+2) " NR c"}'

输出:

x1 NR c x2 NR c x3 NR c
y1 NR c y2 NR c y3 NR c
z1 NR c z2 NR c z3 NR c

相同的表但已转置(适用于您的任务变体):

cat data | tr -d , | awk '{for (i = 1; i <= NF/3; i += 1) print $i " NR c " $(i+3) " NR c " $(i+6) " NR c"}'

输出:

x1 NR c y1 NR c z1 NR c
x2 NR c y2 NR c z2 NR c
x3 NR c y3 NR c z3 NR c


对于您的任务更新,请检查以下解决方案(使用 bash ):

cat data | sort | while read L;
do
  y=`echo $L | cut -f1 -d' '`;
  {
    test "$x" = "$y" && echo -n " `echo $L | cut -f2- -d' '`";
  } ||
  {
    x="$y";echo -en "\n$L";
  };
done

(来自我solution的类似问题)

评论后更新了脚本:

sort data | while read L 
do
  y="`echo \"$L\" | cut -f1 -d' '`"
  if [ "$x" = "$y" ]
  then
    echo -n " `echo \"$L\" | cut -f2- -d' '`"
  else
    x="$y"
    echo -en "\n$L"
  fi
done