im键入可读取文件名、分隔符和字段号的脚本。之后,对每一行进行输入,替换字段(由字段号指定)并输出到同一文件。
例如,如果输入如下:

Ritesh;M;1992
Shakya;F;1993

For the command

bash_script.sh test.csv ";" 3

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

So far i managed to get upto this point:

#!/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。
提前谢谢。

最佳答案

回答第一个问题
如果只需要用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发表了评论,因为您可以选择重命名文件或保留新文件。

10-06 04:27
查看更多