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.
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'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!
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.
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