如何将特定行中特定列中的不同数字相乘?

如何将特定行中特定列中的不同数字相乘?

我想分别在第二列(第 5 行)、(第 6 至第 8 行)和(第 9 至第 10 行)中乘以 5、4、3。

我只能使用下面的命令乘以一个数字

awk '{print $1, $2*5, $3,$4}' defect > out.txt

输入:

# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
 1 100 1 1 
 2 200 1 1 
 3 300 1 1 
 4 400 1 1 
 5 500 1 1 
 6 600 1 1 
 7 700 2 2 
 8 800 2 2 
 9 900 2 2 
 10 1000 2 2

预期输出:

# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
 1 500 1 1 
 2 1000 1 1 
 3 1500 1 1 
 4 2000 1 1 
 5 2500 1 1 
 6 2400 1 1 
 7 2800 2 2 
 8 3200 2 2 
 9 2700 2 2 
 10 3000 2 2

答案1

您需要在 awk 中使用NR= 行号变量

awk 'NR<=5{$2=$2*5};NR>5 && NR<=8{$2=$2*4};NR>8 && NR<=10{$2=$2*3};1' file1
1 500 1 1
2 1000 1 1
3 1500 1 1
4 2000 1 1
5 2500 1 1
6 2400 1 1
7 2800 2 2
8 3200 2 2
9 2700 2 2
10 3000 2 2

答案2

您可以使用if...else语句 andNR来获取行号。

awk '{if (NR==1) {print $1, $2*5, $3, $4, $5} else if (NR <= 6) {print $1, $2*5, $3, $4, $5} else if (NR<=9) {print $1, $2*4, $3, $4, $5} else {print $1, $2*3, $3, $4, $5}}' defect > out.txt

ETC。

答案3

如果第一个字段是乘数的控件(因为行号受任何标题行影响),则可以与 $1 匹配:

awk '$1 ~ /1$|2|3|4|5/ {$2*=5}; $1 ~ /6|7|8/ {$2*=4}; $1 ~ /9|10/ {$2*=3};1' defect 
# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
1 500 1 1
2 1000 1 1
3 1500 1 1
4 2000 1 1
5 2500 1 1
6 2400 1 1
7 2800 2 2
8 3200 2 2
9 2700 2 2
10 3000 2 2

答案4

通过使用 awk-if-else if-else 条件完成

awk '{if (NR<6){print $1,5*$2,$3,$4}else if(NR>5 && NR<9){print $1,4*$2,$3,$4}else {print $1,3*$2,$3,$4}}' p

输出

1 500 1 1
2 1000 1 1
3 1500 1 1
4 2000 1 1
5 2500 1 1
6 2400 1 1
7 2800 2 2
8 3200 2 2
9 2700 2 2
10 3000 2 2

相关内容