我想分别在第二列(第 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