Shell Script para remover aspas duplas dentro do valor da coluna

2

Eu tenho um arquivo de texto de entrada com 10 colunas, enquanto processo este arquivo, em uma das colunas do meio, estou obtendo esse tipo de dados. Eu precisava que o valor da coluna fosse o seguinte:

Valor da coluna de entrada: "Este é o meu novo programa:" Hello World ""

Valor da coluna obrigatória: "Este é o meu novo programa: Hello World".

Por favor, me ajude em qualquer shell script do Unix ou em qualquer comando. Realmente aprecio o seu tempo e obrigado antecipadamente.

    
por Karthik 14.10.2015 / 19:08

2 respostas

9

Uma opção muito simples é usar sed como @Dani propõe se você quiser remover todas aspas duplas.

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

This is my program Hello World

No entanto, se você quiser remover apenas as aspas internas, sugiro remover todas as citações e adicionar uma no início e uma no final da seguinte forma.

Digamos que temos um arquivo sample.txt com estes conteúdos:

$ cat sample.txt

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

Então, se você quiser remover apenas as aspas internas, sugiro o seguinte:

$ 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"

Explicação:

sed 's / "// g' remove todas as aspas duplas em cada linha

sed 's / ^ / "/' adiciona um aspas no início de cada linha

sed / $ / "/ ' adiciona um aspas no final de cada linha

sed 's / | / "|" / g' adiciona uma cotação antes e depois de cada pipe.

Espero que isso ajude.

EDIT : De acordo com o comentário do separador de pipe, temos que alterar ligeiramente o comando

Deixe o exemplo.txt ser:

$ cat sample.txt

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

Em seguida, adicionar um comando replacer para o pipe nos fornece a solução final.

$ 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"

A opção de script

Usando este arquivo sample.txt

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

E esse 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

Você receberá isto:

$ ./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"

Espero que este seja o processamento de que você precisa.

Me avise!

EDIÇÃO FINAL

Este script processa a linha de entrada que você forneceu, várias vezes incluída. A única restrição é que todas as 20 colunas DEVEM ESTAR NA mesma linha.

#!/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

A partir daqui, você deve conseguir que funcione para o seu caso em particular.

    
por 14.10.2015 / 20:38
0

O critério mais simples para editar um campo é "se tiver letras".
Campos com apenas números (e alguns símbolos, etc) devem ser deixados em paz.
Este simples script awk faz o trabalho:

#!/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
    
por 22.10.2015 / 05:21