Awk减去两个文件之间的许多列

时间:2018-02-02 15:44:41

标签: awk

如果我有两个文件,每个文件有4列数据,我想在这些文件之间减去列,我会这样做:

paste data1.txt data2.txt | awk '{ printf("%s %d %d %d\n", $1, ($2-$6), ($3-$7), ($4-$8); }' > out.txt

如果我有每列100列的文件,我应该如何做类似的事情我想在两个文件之间减去列而不写那么多($ i- $ j),($ k- $ l)等。

谢谢。

3 个答案:

答案 0 :(得分:1)

使用循环。您需要传入列数

awk -v cols=100 '{ 
    printf "%s", $1
    for (i=2; i <= cols; i++)
        printf "%s%d", OFS, $i - $(cols+i)
    printf "\n"
}'

答案 1 :(得分:0)

awk救援!

假设你的file1有一个列而不是file2,并且你正在从file1和file2中区分相应的列

$ paste file1 file2 | 
  awk '{n=int(NF/2); printf "%s", $1; 
        for(i=2;i<=n+1;i++) printf "%d" ,OFS ($i-$(i+n)); printf "\n"}'

它还隐含地假设字段的总数是奇数。

使用虚拟数据

创建100列文件;将行标题附加到其中一个。由于数据部分相等,所有差异预计都为零。

$ seq 200 | xargs -n 100 > file2
$ paste <(echo -e "row1\nrow2") file2 > file1

$ paste file1 file2 | awk ...

row1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
row2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

答案 2 :(得分:0)

使用getline;松散地基于我找到的答案here

awk '{split($0,a);getline<"file2";for(i=1;i<=NF;i++)$i=a[i]-$i;}1' file1

实施例

文件1:

31 33 35 37
51 53 55 57

file2的:

21 22 23 24
31 32 33 34

输出:

10 11 12 13
20 21 22 23