Substitua determinado campo do arquivo pela entrada do usuário para cada linha e salve no mesmo arquivo

0

Estou escrevendo para escrever um script que possa ler file_name , delimitador e field_number . Depois disso, para cada linha, pegue uma entrada, substitua o campo (especificado por field_number ) e envie para o mesmo arquivo.

Por exemplo, se a entrada for a seguinte:

Ritesh;M;1992
Shakya;F;1993

Para o comando

bash_script.sh test.csv ";" 3

Iterando cada linha se eu inserir 1994 para primeiro e 1995 para segundo. Eu quero que a saída seja a seguinte cavada no mesmo arquivo.

Ritesh;M;1994
Shakya;F;1995

Até agora eu consegui chegar até este ponto:

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

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

Além disso, minha versão de gawk não suporta -i. Agradecemos antecipadamente.

    
por riteshakya037 29.02.2016 / 10:59

1 resposta

0

Após a ajuda do @ClaudioM, encontrei a resposta que estava procurando.

#!/bin/bash
if [ -z "${3}" ];then
        echo "Usage: <filename> <delimiter> <field_no>"
else
        FILENAME=$1
        DELIMITER=$2
        FIELD_NO=$3
        TEMP_FILE=/tmp/tempFile
        if [ -f $TEMP_FILE ]; then
            rm $TEMP_FILE
        fi
        OLDIFS=$IFS; IFS=$'\n'
        for line in $(cat $FILENAME)
        do
                echo $line
                oldValue='echo $line|cut -d$DELIMITER -f$FIELD_NO'
                echo "Enter the value to replace [$oldValue]"
                read newValue
                echo $line | awk -F "$DELIMITER" '{$'$FIELD_NO'="'$newValue'"}{print}' OFS=$DELIMITER >> $TEMP_FILE;IFS=$OLDIFS
        done
fi
mv $TEMP_FILE $FILENAME
    
por 01.03.2016 / 17:35

Tags