두 번째 열(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
명령문을 사용하여 NR
행 번호를 얻을 수 있습니다.
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
등.
답변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