简体   繁体   English

将awk输出打印到新列中

[英]Print awk output into new column

I have lot of files modified (after filtration) and I need to print NR and characters about new files into column - lets see example: 我修改了许多文件(过滤后),我需要将NR和有关新文件的字符打印到列中-让我们看示例:

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

script: 脚本:

for i in x* y* z*

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

done;

my output looks like: 我的输出看起来像:

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

And I need to save each loop to new column no line: 而且我需要将每个循环保存到新列中无行:

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

to keep corresponding files (after filtration) on the same line. 将相应文件(过滤后)保留在同一行上。 I hope I am clear. 我希望我清楚。 I need to do this in BASH and awk. 我需要在BASH和AWK中执行此操作。 Thank you for any help!! 感谢您的任何帮助!!

EDITED: 编辑:

the real output look like: 实际输出如下所示:

    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
    .
    .
    .

and I need: 我需要:

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

I hope it is clear.. 我希望很清楚。

Try this: 尝试这个:

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

Output: 输出:

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

Same table but transposed (for your task variant): 相同的表但已转置(针对您的任务变型):

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"}'

Output: 输出:

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


For your task update check the following solution (using bash ): 对于您的任务更新,请检查以下解决方案(使用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

(from my solution for similar problem) (从我的类似问题的解决方案中)

Updated script after comment: 评论后更新了脚本:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM