gpt4 book ai didi

linux - 用每一行的用户输入替换文件中的某些字段并保存在同一个文件中

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:35 24 4
gpt4 key购买 nike

我正在打字以编写可以读取file_namedelimiterfield_number 的脚本。之后对每一行进行输入,替换字段(由 field_number 指定)并输出到同一个文件。

例如如果输入如下:

Ritesh;M;1992Shakya;F;1993

For the command

bash_script.sh test.csv ";" 3

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

Ritesh;M;1994Shakya;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 进行了注释,因为您可以选择重命名文件或保留新文件。

关于linux - 用每一行的用户输入替换文件中的某些字段并保存在同一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com