【问题标题】:Replacing second column using shell script使用 shell 脚本替换第二列
【发布时间】:2011-03-17 11:14:13
【问题描述】:

我想将第二列更改为大写,并且我只想在 shell 脚本中进行。 (没有人衬!)

#!/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。 有什么建议吗?

【问题讨论】:

    标签: sed awk grep shell


    【解决方案1】:

    awk 看不到 $mycol_new,因为它是一个 shell 变量。这是使用 -v 标志将 shell 变量传递到 awk 的一种方法:

    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}'
    

    【讨论】:

    • 我使用的是你建议的第一种方法。唯一的问题是,如果我在第三列或第五列中有文本 \N,它将被转换为 N(无斜杠)我如何保持文本原样。
    • @shantanuo awk 如果反斜杠不是可识别的转义序列之一,则会去掉它。因此,如果它是 \n,awk 会将它识别为换行符,但 \N 被简单地解释为 N。更多细节在这里 math.utah.edu/docs/info/gawk_5.html 也许你应该使用下面不使用 awk 的答案之一。
    【解决方案2】:

    为什么没有一个班轮?做作业?

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

    【讨论】:

    • 一些旧版本的 AWK 可能没有toupper(),否则 +1。
    • 我不认为 OP 使用的是旧版本。甚至nawk 都有。
    【解决方案3】:

    如果你想在 shell 中完成这一切,那么你不需要 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"
    

    【讨论】:

    • 更正:“#假设 bash 4”
    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 2017-11-09
    • 1970-01-01
    • 2020-02-14
    • 2020-01-03
    • 2022-08-18
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多