簡體   English   中英

Awk減去兩個文件之間的許多列

[英]Awk subtract many columns between two files

如果我有兩個文件,每個文件有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)等,我應該怎么做類似的事情。

謝謝。

使用循環。 您需要傳入列數

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

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

使用getline ; 松散地基於我在這里找到的答案:

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

文件2:

21 22 23 24
31 32 33 34

輸出:

10 11 12 13
20 21 22 23

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM