【问题标题】:edit a file in a specific column of a splited file bash shell在拆分文件 bash shell 的特定列中编辑文件
【发布时间】:2016-07-16 08:44:47
【问题描述】:

我有一个问题,用户提供了文件、列、值和行的 ID。我正在尝试更改该行的值

文件格式为:

F1|F2|F3|F4|F5|F6|F7|F8

我这样做的想法是读取文件并将每个字段的值放入一个数组中。然后我会找到我想使用 if 更改的行,我将使用 awk

while IFS=$'|t' read -r -a myArray
do
 if [ $4 == ${myArray[0]} ]; then
    echo "${myArray[1]} ${myArray[2]} ${myArray[4]}"
    awk -v column="$5" -v value="$6"-F '{ ${myArray[column]} = value }'
    echo "${myArray[1]} ${myArray[2]} ${myArray[4]}"
    echo "${column} ${value}"
 fi
done < $2

但是,当我这样做时,没有任何变化:列和值参数不打印任何内容。
有什么想法吗?

【问题讨论】:

  • 每次你在 shell 中写一个循环只是为了操作文本你有错误的方法。阅读 unix.stackexchange.com/questions/169716/… 了解更多背景信息,并阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书,了解如何正确进行。

标签: arrays bash file awk


【解决方案1】:

你没有提供太多信息。假设您要更改 field2 为 F2 的特定列,您可以执行以下操作:

  1. $2=="F2" 正在检查字段 2 是否与您的特定字符串匹配。
  2. $2="Hello" 将“Hello”分配给字段 2
  3. $1=$1 重新分配整个记录(行)
  4. print打印整条记录

awk -F"|" 'BEGIN{OFS="|"} ($2=="F2"){$2="Hello";$1=$1; print}' sample.csv

看我的例子:

$cat sample.csv                                                                                    
F1|F2|F3|F4|F5|F6|F7|F8

$awk -F"|" 'BEGIN{OFS="|"} ($2=="F2"){$2="Hello";$1=$1; print}'  sample.csv                        
F1|Hello|F3|F4|F5|F6|F7|F8

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多