Замена второго столбца с помощью сценария оболочки - PullRequest
1 голос
/ 17 марта 2011

Я хочу изменить второй столбец на верхний регистр, и я хочу сделать это только в сценарии оболочки. (ни одного лайнера!)

#!/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

Я не могу заменить $ 2 на $ mycol_new. Любое предложение?

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

awk не может видеть $mycol_new, потому что это переменная оболочки. Вот один из способов передачи переменной оболочки в awk с использованием флага -v:

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

Вот альтернативный метод, который позволяет расширить оболочку $mycol_new:

echo $line | awk -F"," '{print $1 ",'"$mycol_new"'," $3 "," $4 "," $5 "," $6 "," $7 "," $8}'
2 голосов
/ 17 марта 2011

почему никто не вкладывает?Делаю уроки?

$ cat file
one two three four
five six seven eight

$ awk '{$2=toupper($2)}1' file
one TWO three four
five SIX seven eight
0 голосов
/ 17 марта 2011

Если вы хотите сделать все это в оболочке, то вам не нужен awk:

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