【问题标题】:Replace certain field from file with user input for each row and save in same file用每一行的用户输入替换文件中的某些字段并保存在同一个文件中
【发布时间】:2016-06-12 06:55:18
【问题描述】:

我正在输入一个脚本,它可以读取 file_name、delimiter 和 field_number。之后,为每一行输入一个输入,替换字段(由 field_number 指定)并输出到同一个文件。

例如如果输入如下:

Ritesh;M;1992
释迦;F;1993

对于命令

bash_script.sh test.csv ";" 3

如果我第一个输入 1994,第二个输入 1995,则遍历每一行。我希望输出在同一个文件中如下所示。

Ritesh;M;1994
释迦;F;1995

到目前为止,我设法达到了这一点:

#!/usr/bin/env bash
echo "Following is the input needed:";
echo "\$1: FILE_NAME";
echo "\$2: DELIMITER";
echo "\$3: FIELD IN NUMERIC VALUE";

gawk -i inplace -F "$2" '{...}' $1;

我的gawk 版本也不支持-i。 提前致谢。

【问题讨论】:

  • 如果你的 gawk 不支持 -i,为什么它在你现在所拥有的例子中......?
  • 您的脚本输入是test.csv v 和3 然后您将1992 转换为1994 和1993 转换为1995。对吗?
  • @123 我可以只写一个 tmp 文件,然后再将其 mv 或其他类似的方法,所以这不是一个主要问题。只是提到它。
  • @claudiom input is test.csv, delimiter ";, field to modity 3. and the rest as you say it.
  • @riteshakya037 哪个是替换逻辑? 1994 为M 和1995 为F ?

标签: linux bash awk sh gawk


【解决方案1】:

使用 sed 始终是我的选择;

#!/bin/bash
FILE=$1
DELIM=$2
FIELD=$3

REPLACEMENT="XXX"
sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD" $FILE

如果它需要从当前值计算出来,你需要循环每一行并提取它。

#!/bin/bash
FILE=$1
DELIM=$2
FIELD=$3

while read line; do
   value="$(echo $line | cut -d"$DELIM" -f$FIELD)"
   if [ "$value" == "1992" ]; then REPLACEMENT="1994";
   elif [ "$value" == "1993" ]; then REPLACEMENT="1995";
   fi
   echo $line | sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD"
done < $FILE

【讨论】:

  • 实际上我想替换列,无论值是什么。并且对于每一行,提示输入一个值。
【解决方案2】:

回答第一个问题

如果您只需要将1992 替换为1994 并将1993 替换为1995,则不需要脚本,您可以使用sed 轻松完成:

sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g" 

输出:

[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995

如果还需要保存输出可以添加

sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g" > temp; mv temp test.scv 

但如果你想使用脚本:

#!/bin/bash

if [ -z "${1}" ];then
        echo "Usage: $0 <filename>"
else
        FILENAME=$1
        sed "s/;1992/;1994/g" $FILENAME| sed "s/;1993/;1995/g"
fi

输出:

[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>

[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995

在上次评论后更新脚本

#!/bin/bash
if [ -z "${3}" ];then
        echo "Usage: <filename> <delimiter> <field_no>"
else
        FILENAME=$(readlink -f $1)
        DELIMITER=$2
        FIELD_NO=$3
        TEMP_FILE=/tmp/tempFile
        if [ -f $TEMP_FILE ]; then
            rm $TEMP_FILE
        fi
        for line in $(cat $FILENAME)
        do
                oldValue=`echo $line|cut -d$DELIMITER -f$FIELD_NO`
                echo "Enter the value to replace [$oldValue]"
                read newValue
                echo $line | sed "s/${oldValue}/${newValue}/g" >> $TEMP_FILE
        done
fi
mv $TEMP_FILE $FILENAME    

我已评论命令#mv tempFile $FILENAME,因为您可以选择重命名文件或保留新文件。

【讨论】:

  • 实际上我想替换列,无论值是什么。并且对于每一行,提示输入一个值。
  • 你只需要用什么替换第3列吗?我的意思是,你从哪里得到替换的值?请尝试更好地解释此脚本的目的。
  • 我想知道是否可以为每一行输入值,即脚本提示我输入第一行的值,更新值,移动到第二个,然后询问第二个值。
  • 这是另一个要求......这与您在问题中提出的完全不同!顺便说一句,我会尝试添加答案
  • @riteshakya037 你检查了我回答的最后一个变化吗?这就是你要找的吗?
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 2019-07-26
  • 2019-04-05
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多