2011-03-17 7 views
1

두 번째 열을 대문자로 변경하고 쉘 스크립트에서만 수행하려고합니다. (아무도 라이너!)쉘 스크립트를 사용하여 두 번째 열 바꾸기

#!/bin/sh 
# read file line by line 
file="/pdump/country.000000.txt" 
while read line 
do 
mycol=`echo $line | awk -F"," '{print $2}'` 
mycol_new=`echo $mycol | tr "[:lower:]" [:upper:]` 
echo $line | awk -F"," '{print $1 "," $mycol_new "," $3 "," $4 "," $5 "," $6 "," $7 "," $8}' 
done < $file 

나는 $ mycol_new으로 $ 2 대체 할 수 아니다 없습니다. 제안 사항이 있으십니까?

답변

4

awk은 쉘 변수이므로 $mycol_new을 볼 수 없습니다. 쉘이 $mycol_new을 확장 할 수 있습니다 다른 방법

echo $line | awk -v var="$mycol_new" -F"," '{print $1 "," var "," $3 "," $4 "," $5 "," $6 "," $7 "," $8}' 

여기에 있습니다 : :

echo $line | awk -F"," '{print $1 ",'"$mycol_new"'," $3 "," $4 "," $5 "," $6 "," $7 "," $8}' 
+0

난 당신이 제안한 첫 번째 방법을 사용하고 있습니다 :

$ cat file one two three four five six seven eight $ awk '{$2=toupper($2)}1' file one TWO three four five SIX seven eight 
shantanuo

+0

@shantanuo awk는 인식 된 이스케이프 시퀀스 중 하나가 아닌 경우 백 슬래시를 제거합니다. 따라서 \ n 인 경우 awk는 줄 바꿈으로 인식하지만 \ N은 단순히 N으로 해석됩니다. 자세한 내용은 http://www.math.utah.edu/docs/info/gawk_5.html을 참조하십시오. 아래 답변은 awk를 사용하지 않습니다. – Ruchi

2

왜 아무도 라이너 여기 -v 플래그를 사용하여 AWK로 쉘 변수를 전달하는 하나의 방법은? 숙제를?

IFS=, 
while read line; do 
    set -- $line 
    a="$1" 
    b="${2^^}" # assumes bash, use "tr" otherwise 
    shift 2 
    set -- "$a" "$b" "[email protected]" 
    echo "$*" 
done < "$file" > "$file.new" 
+0

일부 AWK 버전은'toupper()'를 가지고 있지 않을 수도 있습니다. 그렇지 않으면 +1합니다. –

+0

OP에서 구 버전을 사용하고 있다고 생각하지 않습니다. '노크 (nawk)'도 그렇다. – kurumi

0

모든 쉘에서이 작업을 수행하려면

는, 당신은 AWK 필요하지 않습니다. 유일한 문제는 3 번째 또는 5 번째 열에 text \ N이있는 경우 N (sans slash)으로 변환된다는 것입니다. 어떻게 텍스트를 그대로 유지합니까?
+0

수정 : "#은 배쉬 ** 4 **로 가정" –

관련 문제