【问题标题】:Difference between adjacent data rows, with multiple columns相邻数据行之间的差异,具有多列
【发布时间】:2016-08-09 06:24:18
【问题描述】:

如果我有:

1  2  3  4  5  6  .  .
3  4  5  4  2  1  .  .
5  7  5  7  2  0  .  .
.
.

我想显示相邻数据行的差异,以便显示:

2  2  2  0 -3 -5  .  .
2  3  0  3  0 -1  .  .
.
.

我找到了difference between number in the same column using AWK 的帖子,并调整了第二个答案,我认为这样就可以了:

awk 'NR>1{print $0-p} {p=$0}' file

但这会在单个列中产生输出。如何让它保留数据的列结构?

【问题讨论】:

  • 答案here 是我想要的,但是如何将它扩展到任意数量的列?
  • 而不是仅仅链接到另一个问题,让这个问题独立存在:你想做什么?
  • @fedorqui 我会重新安排问题,这样就可以了。
  • edit 你的问题是摆脱所有使样本输入/输出无法测试的.s。我们需要一些可以运行潜在解决方案并区分输出的东西 - 您的输入/输出中的...s 会让这变得更加困难。

标签: awk


【解决方案1】:
$ cat tst.awk
NR>1 {
    for (i=1; i<=NF; i++) {
        printf "%2d%s", $i - p[i], (i<NF ? OFS : ORS)
    }
}
{ split($0,p) }

$ awk -f tst.awk file
 2  2  2  0 -3 -5
 2  3  0  3  0 -1

【讨论】:

【解决方案2】:

试试这样的:

awk '{for (i=1; i <= NF; i++) { c[i] = $i - c[i] }; count = NF }
     END { for (i = 1; i <= count; i++) { printf c[i] " "}}' numbers

【讨论】:

  • 这给了我一排零。
  • *一行数字
【解决方案3】:

写出来:

$ cat > subtr.awk
{
    for (i=1; i<=NF; i++) b[i]=a[i]
    # for (i in a) b[i]=a[i]
    n=split($0,a)
}
NR > 1 {
    for (i=1; i<=NF; i++) {
    #for(i in a) {
        printf "%s%s", a[i]-b[i], (i==n?ORS:OFS)
    }
delete b
}

测试一下:

$ awk -f subtr.awk file
2 2 2 0 -3 -5
2 3 0 3 0 -1

【讨论】:

  • 如何对多行数据执行此操作?
  • 确实如此。在您的示例中,line1 是从 line2 中减去的。如果您向我的解决方案提供更多行,假设 3,从 line2 中减去 line1,然后从 line3 中减去差异。
  • 好的,我看到你更新了问题。给我一分钟。
  • 哦!我只想要相邻行的差异。对不起,我最初提出问题的方式不清楚。我现在已经进行了相应的修改。
  • 好的,如果我正确编辑它现在应该可以工作了。我试图使用asortia 复制到b 而不使用for,但这适得其反。我需要稍后测试一下。
猜你喜欢
  • 2018-10-14
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多