如果我有两个文件,每个文件有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)等。
谢谢。
答案 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