【问题标题】:Print awk output into new column将 awk 输出打印到新列中
【发布时间】:2014-12-12 10:39:19
【问题描述】:

我修改了很多文件(过滤后),我需要将新文件的 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
.
.
.

我希望清楚..

【问题讨论】:

  • 有点不清楚你的意思。文字 NRc 或者它们包含一些值?
  • @fedorqui 很抱歉,是的,NR 是文档中的行数,C 是字数 - 经过一些过滤后它正在改变。
  • 没问题!请注意,for i in x* y* z* 会将所有x*y*z* 展开为一个大列表,并且每个循环都会选择其中一项。所以实际上没有这样的循环包含来自x* 的一个项目,另一个来自y* 和另一个来自z* 的项目。
  • 发布一些示例输入和您期望从该输入中获得的输出,以便我们为您提供帮助。您的输出中的 x、y 等与 x1、x2 等有什么关系?所有这些小于 1 的数字与您要打印的行数和字符数有什么关系?

标签: bash loops awk


【解决方案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

【讨论】:

  • @rook 非常感谢您抽出宝贵的时间。如果我的输出具有相同的名称 x y 和 z (没有索引 x1、x2、x3 ...),您认为可以修改吗? T感谢您的帮助。
  • 是的,这应该可以工作,如果你想输出NR awk 变量,那么你可以写print 不带引号空格的行:print $i, NR, ...print $i NR 不带逗号 - 这将输出$iNR,它们之间没有空格
  • 这在很多方面都是错误的。 UUOC、错误使用读取、缺少 IFS 设置、无用管道、不推荐使用反引号、不必要的 shell 循环、无用的尾随分号、未引用的变量等。
  • 分号用来方便地把这个脚本转换成一行。我也故意不使用ifthen 构造来减少屏幕上的符号数量。同意,cat 太过分了。所以..复制以前的工作:)
最近更新 更多