Linux 将文件中的某些字段替换为每行的用户输入,并保存在同一文件中

Linux 将文件中的某些字段替换为每行的用户输入,并保存在同一文件中,linux,bash,awk,sh,gawk,Linux,Bash,Awk,Sh,Gawk,我正在输入一个脚本,可以读取文件名、分隔符和字段号。之后,为每一行获取一个输入,替换字段(由字段\u编号指定)并输出到同一文件 Ritesh;M;1994 Shakya;F;1995 例如,如果输入如下所示: Ritesh;M;1992 Shakya;F;1993 如果第一行输入1994,第二行输入1995,则迭代每一行。我希望输出是相同文件中的如下内容 Ritesh;M;1994 Shakya;F;1995 另外,我的gawk版本不支持-i。 提前感谢。使用sed始终是我的选择 #!/bin/

我正在输入一个脚本,可以读取文件名分隔符字段号。之后,为每一行获取一个输入,替换字段(由字段\u编号指定)并输出到同一文件

Ritesh;M;1994 Shakya;F;1995 例如,如果输入如下所示:

Ritesh;M;1992 Shakya;F;1993 如果第一行输入1994,第二行输入1995,则迭代每一行。我希望输出是相同文件中的如下内容

Ritesh;M;1994 Shakya;F;1995 另外,我的
gawk
版本不支持-i。
提前感谢。

使用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
#/bin/bash
文件=$1
德利姆=2美元
字段=$3
读行时;做
value=“$(echo$行| cut-d“$DELIM”-f$字段)
如果[“$value”==“1992”];然后替换=“1994”;
elif[“$value”==“1993”];然后替换=“1995”;
fi
echo$line | sed“s/[^$DELIM]*/$REPLACEMENT/$FIELD”
完成<$FILE

使用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
#/bin/bash
文件=$1
德利姆=2美元
字段=$3
读行时;做
value=“$(echo$行| cut-d“$DELIM”-f$字段)
如果[“$value”==“1992”];然后替换=“1994”;
elif[“$value”==“1993”];然后替换=“1995”;
fi
echo$line | sed“s/[^$DELIM]*/$REPLACEMENT/$FIELD”
完成<$FILE

第一个问题的答案

如果您只需要将
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
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>

[shell] ➤ ./test3.sh test.csv
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
#/bin/bash
如果[-z“${1}”];然后
echo“用法:$0”
其他的
文件名=$1
sed“s/;1992/;1994/g”$FILENAME | sed“s/;1993/;1995/g”
fi
输出:

[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>

[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995
[shell]➤ ./test3.sh
用法:./test3.sh
[壳牌]➤ ./test3.sh test.csv
礼节;M1994
动摇;F1995
上次评论后更新的脚本

#!/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    
#/bin/bash
如果[-z“${3}”];然后
回显“用法:”
其他的
文件名=$(readlink-f$1)
分隔符=$2
字段号=$3
临时文件=/tmp/tempFile
如果[-f$TEMP_文件];然后
rm$TEMP_文件
fi
对于$中的行(cat$文件名)
做
oldValue=`echo$line | cut-d$DELIMITER-f$FIELD|NO`
echo“输入要替换的值[$oldValue]”
读取新值
echo$line | sed“s/${oldValue}/${newValue}/g”>>$TEMP_文件
完成
fi
mv$TEMP_文件$FILENAME

我对命令
#mv tempFile$FILENAME
进行了注释,因为您可以选择重命名文件或保留新文件。

回答第一个问题

如果您只需要将
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
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>

[shell] ➤ ./test3.sh test.csv
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
#/bin/bash
如果[-z“${1}”];然后
echo“用法:$0”
其他的
文件名=$1
sed“s/;1992/;1994/g”$FILENAME | sed“s/;1993/;1995/g”
fi
输出:

[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>

[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995
[shell]➤ ./test3.sh
用法:./test3.sh
[壳牌]➤ ./test3.sh test.csv
礼节;M1994
动摇;F1995
上次评论后更新的脚本

#!/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    
#/bin/bash
如果[-z“${3}”];然后
回显“用法:”
其他的
文件名=$(readlink-f$1)
分隔符=$2
字段号=$3
临时文件=/tmp/tempFile
如果[-f$TEMP_文件];然后
rm$TEMP_文件
fi
对于$中的行(cat$文件名)
做
oldValue=`echo$line | cut-d$DELIMITER-f$FIELD|NO`
echo“输入要替换的值[$oldValue]”
读取新值
echo$line | sed“s/${oldValue}/${newValue}/g”>>$TEMP_文件
完成
fi
mv$TEMP_文件$FILENAME

我已经对命令
#mv tempFile$FILENAME
进行了注释,因为您可以选择重命名该文件或保留新文件。

如果您的gawk不支持-I,为什么您的示例中会出现该命令?您的脚本输入是
test.csv
v
3
,然后您将在
1994
中转换
1992
,在
1995中转换
1993
。是吗?@123我只需要写一个tmp文件,然后把它安装到适当的位置,或者其他类似的方法,所以这不是主要的问题。我刚才提到过。@claudiom输入是test.csv,分隔符";, 字段到modity 3。其余的正如你所说的。@riteshakya037这是替换逻辑
1994
用于
M
1995
用于
F
?如果您的gawk不支持-i,为什么会出现在您目前拥有的示例中?您的脚本输入是
test.csv
v
3
,然后您将在
1994
中转换
1992
,在
1995中转换
1993
。是吗?@123我只需要写一个tmp文件,然后把它安装到适当的位置,或者其他类似的方法,所以这不是主要的问题。我刚才提到过。@claudiom输入是test.csv,分隔符";, 字段到modity 3。其余的正如你所说的。@riteshakya037这是替换逻辑
1994
对于
M
1995
对于
F
?实际上,我想替换该列,无论其值是多少。对于每一行,提示输入一个值。实际上,我想替换该列,不管该列的值是多少。对于每一行,提示输入一个值。实际上,我想替换该列,不管该列的值是多少。对于每一行,