gpt4 book ai didi

bash - 根据不同的 gsub 条件同时 gsub 多列?

转载 作者:行者123 更新时间:2023-11-29 09:10:01 26 4
gpt4 key购买 nike

我有一个包含以下数据的文件-

输入-

A B C D E F
A B B B B B
C A C D E F
A B D E F A
A A A A A F
A B C B B B

如果从第 2 行开始的任何其他行与第 1 行具有相同的字母,则应将它们更改为 1。基本上,我试图找出任何行与第一行的相似程度。

期望的输出-

1 1 1 1 1 1
1 1 B B B B
C A 1 1 1 1
1 1 D E F A
1 A A A A 1
1 1 1 B B B

第一行全为 1,因为它与自身相同(很明显)。在第二行中,第一列和第二列与第一行 (A B) 相同,因此它们变为 1 1。其他行依此类推。

我写了下面的代码来做这个转换-

for seq in {1..1} ; #Iterate over the rows (in this case just row 1)
do
for position in {1..6} ; #Iterate over the columns
do
#Define the letter in the first row with which I'm comparing the rest of the rows
aa=$(awk -v pos=$position -v line=$seq 'NR == line {print $pos}' f)
#If it matches, gsub it to 1
awk -v var=$aa -v pos=$position '{gsub (var, "1", $pos)} 1' f > temp
#Save this intermediate file and now act on this
mv temp f
done
done

如您所想,这真的很慢,因为嵌套循环的开销很大。我的真实数据是一个 60x10000 矩阵,这个程序在上面运行大约需要 2 个小时。

我希望你能帮助我摆脱内部循环,这样我就可以一步完成所有 6 个 gsub。也许将它们放在自己的数组中?我的 awk 技能还不够好。

最佳答案

您可以使用这个更简单的 awk 命令来完成工作,因为我们避免了 shell 中的嵌套循环,并且还在嵌套循环中重复调用 awk:

awk '{for (i=1; i<=NF; i++) {if (NR==1) a[i]=$i; if (a[i]==$i) $i=1} } 1' file

1 1 1 1 1 1
1 1 B B B B
C A 1 1 1 1
1 1 D E F A
1 A A A A 1
1 1 1 B B B

编辑:

根据下面的评论,您可以执行以下操作来获取每一行中每一列的总和:

awk '{sum=0; for (i=1; i<=NF; i++) { if (NR==1) a[i]=$i; if (a[i]==$i) $i=1; sum+=$i}
print $0, sum}' file

1 1 1 1 1 1 6
1 1 B B B B 2
C A 1 1 1 1 4
1 1 D E F A 2
1 A A A A 1 2
1 1 1 B B B 3

关于bash - 根据不同的 gsub 条件同时 gsub 多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com