web-dev-qa-db-fra.com

Shell Script pour supprimer des guillemets doubles dans la valeur de la colonne

J'ai un fichier texte d'entrée avec 10 colonnes, tout en traitant ce fichier, dans l'une des colonnes du milieu, je reçois ce type de données.I Valeur de colonne requise comme ci-dessous:

Valeur de la colonne d'entrée: "Ceci est mon nouveau programme:" Bonjour World ""

Valeur de colonne requise: "Ceci est mon nouveau programme: Bonjour World".

S'il vous plaît aidez-moi dans n'importe quel scripts Unix Shell ou toutes les commandes. Vraiment apprécier votre temps et merci d'avance.

6
Karthik

Une option très simple consiste à utiliser sed comme @Dani propose si vous voulez supprimer tous les guillemets doubles.

$ echo "This is my program \"Hello World\"" | sed 's/"//g'

This is my program Hello World

Néanmoins, si vous souhaitez supprimer seulement des citations internes, je vous suggère de retirer toutes les citations et l'ajout d'un au début et à la fin comme suit.

Disons que nous avons un sample.txt fichier avec ces contenus:

$ cat sample.txt

"This is the "First" Line"
"This is the "Second" Line"
"This is the "Third" Line"

Ensuite, si vous voulez supprimer seulement des citations internes, je suggère ce qui suit:

$ cat sample.txt | sed 's/"//g' | sed 's/^/"/' |sed 's/$/"/'

"This is the First Line"
"This is the Second Line"
"This is the Third Line"

Explication:

sed 's/"// g' supprime toutes les guillemets doubles sur chaque ligne

sed 's/^/"/' ajoute une double citation au début de chaque ligne

sed " s/$ /"/" ajoute un guillemet à la fin de chaque ligne

sed 's/|/"|"/g' ajoute une citation avant et après chaque tuyau.

J'espère que cela t'aides.

MODIFIER : Comme par le commentaire de séparation de pipe, nous devons changer légèrement la commande

Laissez-sample.txt être:

$ cat sample.txt

"This is the "First" column"|"This is the "Second" column"|"This is the "Third" column"

Puis, en ajoutant une commande succédané pour le tuyau nous donner la solution finale.

$ cat sample.txt | sed 's/"//g' | sed 's/^/"/' |sed 's/$/"/' | sed 's/|/"|"/g'

"This is the First column"|"This is the Second column"|"This is the Third column"

L'option de script

L'utilisation de ce fichier sample.txt

$ cat sample.txt
"This is the "first" column"|12345|"This is the "second" column"|67890|"This is the "third" column"

Et ce script

#!/bin/ksh

counter=1
column="initialized"
result=""
while [[ "$column" != "" ]]
do
    eval "column=$(cat sample.txt | cut -d"|" -f$counter)"
    eval "text=$(cat sample.txt | cut -d"|" -f$counter | grep '"')"
    if [[ "$column" = "$text" && -n "$column" ]]
    then
        if [[ "$result" = "" ]]
        then
            result="_2quotehere_${column}_2quotehere_"
        else
            result="${result}|_2quotehere_${column}_2quotehere_"
        fi
    else
        if [[ -n "$column" ]]
        then
            if [[ "$result" = "" ]]
            then
                result="${column}"
            else
                result="${result}|${column}"
            fi
        fi
    fi
    echo $result | sed 's/_2quotehere_/"/g' > output.txt
    (( counter+=1 ))
done
cat output.txt
exit 0

Vous obtiendrez ceci:

$ ./process.sh
"This is the first column"|12345|"This is the second column"|67890|"This is the third column"

$ cat output.txt
"This is the first column"|12345|"This is the second column"|67890|"This is the third column"

J'espère que cela est le traitement dont vous avez besoin.

Fais-moi savoir!

FINAL EDIT

Ce script traite la ligne d'entrée que vous avez fourni, plusieurs fois inclus. Seule restriction est que toutes les 20 colonnes doivent être sur la même ligne.

#!/bin/ksh

rm output.txt > /dev/null 2>&1
column="initialized"
result=""
lineCounter=1
while read line
do
    print "LINE $lineCounter: $line"
    counter=1
    while [[ ${counter} -le 20 ]]
    do
        eval 'column=$(print ${line} | cut -d"|" -f$counter)'
        eval 'text=$(print ${line} | cut -d"|" -f$counter | grep \")'
        print "LINE ${lineCounter} COLUMN ${counter}: $column"
        if [[ "$column" = "$text" && -n ${column} ]]
        then
            if [[ "$result" = "" ]]
            then
                result="_2quotehere_$(echo ${column} | sed 's/\"//g')_2quotehere_"
            else
                result="${result}|_2quotehere_$( echo ${column} | sed 's/\"//g')_2quotehere_"
            fi
        else
            if [[ "$result" = "" ]]
            then
                result=${column}
            else
                result="${result}|${column}"
            fi
        fi
        (( counter+=1 ))
    done
    (( lineCounter+=1 ))
    echo -e $result | sed 's/_2quotehere_/"/g' >> output.txt
    result=""
done < input.txt
print "OUTPUT CONTENTS:"
cat output.txt

exit 0

De là, vous devez être en mesure de le faire fonctionner pour votre cas particulier.

17
Jesus A. Sanchez

Les critères les plus simples pour éditer un champ sont "s'il a des lettres".
Champs avec des numéros Seuls (et certains symboles., - etc.) doivent être laissés seuls.
[.____] Ce script awk simple fait le travail:

#!/bin/bash

awk -v FS='|' -v OFS='|' '{
for ( i=1; i<=NF; i++) {
    if ( $i ~ /[a-zA-Z]/ ) {
        gsub(/["]/,"",$i); $i="\"" $i "\""    # Remove dquotes, add them back.
    }
} }1' input.txt >output.txt
0
user79743