【问题标题】:How to compare first column of two files and print the difference of second and third column?如何比较两个文件的第一列并打印第二列和第三列的差异?
【发布时间】:2017-01-03 06:18:00
【问题描述】:

我想比较两个不同文件的第一列,如果匹配,将两个文件的第二列和第三列的差异放入一个新文件中,第一列作为匹配条目。

Output File = Matched,Difference of c2 and c3 of file1,Difference of c2 and c3 of file 2

例子:

文件 1

12,1,3 
13,2,4 
14,5,7

文件 2

12,4,5
13,4,7
15,3,9

所需的输出文件

12 -2 -1
13 -2 -3

请告诉我该怎么做。 文件长度不同。 File1 的长度为 100,File2 的长度为 20

【问题讨论】:

  • 1 2 3 @codeforester

标签: bash shell awk solaris


【解决方案1】:

使用更适合此的awk

awk 'BEGIN{FS=","}FNR==NR{array1[$1]=$2-$3; next}($1 in array1){array2[$1]=$2-$3}END{for (i in array2){print i,array1[i],array2[i]}}' file1 file2
12 -2 -1
13 -2 -3

如果awk不是Solaris中的原生,你可以试试nawk吗,把下面的内容放在一个名为nawk_script.awk的文件中

BEGIN{FS=","}
FNR==NR{array1[$1]=$2-$3; next}($1 in array1){array2[$1]=$2-$3}
END{for (i in array2){print i,array1[i],array2[i]}}

然后运行它

nawk -f nawk_script.awk file1 file2

【讨论】:

  • 我肯定犯了一个非常愚蠢的错误。我收到awk: syntax error near line 1 awk: bailing out near line 1
  • @nainometer: awk 可能不是 Solaris 中的原生代码,你能用其余的命令试试 nawk
  • 使用 nawk:nawk: syntax error at source line 1 context is >>> BEGIN{FS=, <<< nawk: illegal statement at source line 1
  • 这与最后的 sort -u 配合得很好 :) 最后一件事,我如何在一个已经准备好的脚本中使用它,该脚本首先生成 2 个文件。跨度>
【解决方案2】:

这样就可以了——它是纯 bash 并且不会派生任何子进程:

#!/usr/bin/env bash

# the following loop will end when an EOF is encountered on
# either of the two input files, whichever happens first.
while IFS=, read -r m1 m2 m3 <&3 && IFS=, read -r n1 n2 n3 <&4; do
  if [[ $m1 == $n1 ]]; then
    printf "%d %d %d\n" $m1 $((m2 - m3)) $((n2 - n3))
  fi
done 3< file1.txt 4< file2.txt

输出:

12 -2 -1
13 -2 -3

【讨论】:

  • 与上述基于awk 的解决方案不同,此解决方案不会在内存中保留任何内容,并且对于较大的文件会更好。
【解决方案3】:

一种方法是使用pasteawk-

paste file1 file2 | awk '{gsub(",", " " , $0)} {if ($1 == $4) print $1, $2-$3, $5-$6}'

输出-

12 -2 -1
13 -2 -3

说明-

paste 命令将文件并排粘贴。 awk gsub 命令将逗号更改为空格。 awk 中的第二个大括号检查第一列和第四列是否相同,如果相同,则进行所需的减法。

【讨论】:

  • paste Data1.csv Data-3.csv | awk '{gsub(",", " " , $0)} {if ($1 == $4) print $1, $2-$3, $5-$6}' awk: syntax error near line 1 awk: illegal statement near line 1
【解决方案4】:

在 awk 中。如果$1 尚未在数组a 中,则减去该值并将其存储到数组中。如果已经存在,则打印键、a 中的值以及减法的值。 13 之前的空格已在您的数据中:

$ awk -F, '!($1 in a){ a[$1]=$2-$3; next } { $3=$2-$3; $2=a[$1] } 1' f1 f2
12 -2 -1
 13 -2 -3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多