.dat 파일에는 스크립트를 사용하여 자동으로 변경한 많은 변수가 있습니다. 이러한 파일 중 하나 bar
에는 .dat 파일에 다음과 같이 배열된 매개변수가 있습니다 .
var1 var2 var3 foo bar
T T T 100 100
나는 bash 스크립트의 다음 줄을 사용하여 bar 값을 임의의 초기 값에서 원하는 값(이 경우 2000)으로 변경했습니다. 이 스크립트는 "bar"를 2000으로 변경합니다.
LINE1=$(awk '/bar/ {++n;if (n==1) {print FNR}}' data.dat)
((LINE1=$LINE1 + 1))
OLD1=$(awk '{for(i=1;i<'$LINE1';i++) getline}{print $12}' data.dat)
sed -i '' "${LINE1}s/$OLD1/2000/" data.dat
하지만 이제 바꿔야 foo
하는데 bar
... 이 예에서 이 설정은 foo
모두 bar
2000입니다.
LINE1=$(awk '/foo/ {++n;if (n==1) {print FNR}}' data.dat)
((LINE1=$LINE1 + 1))
OLD1=$(awk '{for(i=1;i<'$LINE1';i++) getline}{print $12}' data.dat)
sed -i '' "${LINE1}s/$OLD1/2000/" data.dat
LINE1=$(awk '/bar/ {++n;if (n==1) {print FNR}}' data.dat)
((LINE1=$LINE1 + 1))
OLD1=$(awk '{for(i=1;i<'$LINE1';i++) getline}{print $12}' data.dat)
sed -i '' "${LINE1}s/$OLD1/2000/" data.dat
대신 2000 foo
으로만 변경되어 bar
변경되지 않은 채로 유지됩니다. 이것이 정규식을 설명하는 방식에 문제가 있다는 것을 알고 있지만 awk/sed 표현식을 사용하여 이 두 변수를 변경할 수는 없습니다.
답변1
넌 할 수있어
awk -v newvalue=2000 '
NR == 1 {
for (i=1; i<=NF; i++) {
if ($i == "foo") i_foo=i
if ($i == "bar") i_bar=i
}
}
NR == 2 {$i_foo = $i_bar = newvalue}
{print}
' file.dat | column -t
var1 var2 var3 foo bar
T T T 2000 2000
또는 awk에서 하드 코딩을 줄이세요.
awk -v cols="var2=1234,bar=5678" '
BEGIN {
n = split(cols, a, /[=,]/)
for (i=1; i<n; i+=2) newval[a[i]] = a[i+1]
}
NR == 1 { for (i=1; i<=NF; i++) if ($i in newval) idx[$i] = i }
NR == 2 { for (col in idx) $(idx[col]) = newval[col] }
{print}
' file.dat | column -t
var1 var2 var3 foo bar
T 1234 T 100 5678
답변2
재미로:
awk -F'\t' -vOFS='\t' -vfoovalue=2101 -vbarvalue=2102 '
/foo/&&/bar/{
row=NR
for(i=1;i<=NF;i++){
if($i=="foo"){colfoo=i}
if($i=="bar"){colbar=i}
}
print
}
NR==row+1{ $colfoo=foovalue; $colbar=barvalue; print }
' file
var1 var2 var3 foo bar
T T T 2101 2102