[英]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.