我有两个N列数的文件,第一行有一个标题(两个文件的列标题相同)。
File1:
Header e f g ...... N
1.0 1 2 3 ...... N1
2.0 2 2 7 ...... N1
3.0 5 3 3 ...... N1
File2:
Header e f g ...... N
1.0 2 2 4 ...... N2
2.0 1 9 4 ...... N2
3.0 12 3 6 ...... N2
I want 1st column value from File1 will be subtracted (absolute value) from 1st
column of File2, and this way till column N as shown below:
Header e f g ...... N
1.0 1 0 1 ...... N1-N2
2.0 1 7 3 ...... N1-N2
3.0 7 0 3 ...... N1-N2
然后,对于每一列,我需要找出最大值和相应的标题值。
例如,column e
的最大值为7,对应于Header value 3
。
The actual desired output given that input Header value = { 3.0, 2.0, 3.0 Or 2.0 }
到目前为止,我只能减去列值并将其存储在文件中。 (打印标题时仍然有问题)
awk 'FNR==NR{for(i=2;i<=NF;i++)a[FNR"-"i]=$i;next}{printf "\n"$1" ";}
FNR>1{for(i=2;i<=NF;i++){printf $i-a[FNR"-"i]" "}}' File01.txt File02.txt | column -t -s' '> subtracted_data.txt```
答案 0 :(得分:1)
awk
来营救!
$ paste file1 file2 |
awk 'function abs(x) {return x<0?-x:x}
NR>1 {n=NF/2;
for(i=2;i<=n;i++)
{v[i]=abs($i-$(i+n));
if(v[i]>max[i]) {max[i]=v[i]; maxIx[i]=$1}}}
END {printf "{";
for(i=2;i<n;i++) printf "%s, ",maxIx[i]
print maxIx[n]"}"}'
{3.0, 2.0, 2.0}
使用paste
组合文件以简化处理。
计算每个绝对值,找到最大值和相应的最大值索引,并在最后打印它们。
答案 1 :(得分:0)
众多可能性之一是:
awk '(NR==1){ print } # print header
(FNR==1){ next } # skip header
# read file1 in memory
# store full line with key $1
(NR==FNR) { a[$1]=$0; next }
# read file2 and
# request file1 value by key, and split in array b
{ split(a[$1],b) }
# perform magic
{ for(i=2;i<=NF;++i) $i-=b[i] }
{ print }' file1 file2
这不是最佳解决方案,但可能会解决问题。