열 값에서 큰따옴표를 제거하는 쉘 스크립트

열 값에서 큰따옴표를 제거하는 쉘 스크립트

10개의 열이 있는 입력 텍스트 파일이 있는데, 파일을 처리하는 동안 중간 열에 이런 유형의 데이터가 표시됩니다. 다음과 같이 열 값이 필요합니다.

열 값 입력: "이것은 내 새 프로그램입니다: "Hello World""

필수 열 값: "이것은 내 새 프로그램입니다: Hello World".

Unix 쉘 스크립트나 명령에 대해 도움을 주세요. 시간 내주셔서 진심으로 감사드리며, 미리 감사드립니다.

답변1

모든 큰따옴표를 제거하려면 매우 간단한 옵션은 @Dani가 제안한 대로 sed를 사용하는 것입니다.

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

This is my program Hello World

하지만 안쪽 따옴표만 제거하려면 아래와 같이 따옴표를 모두 제거하고 시작 부분과 끝 부분에 하나씩 추가하는 것이 좋습니다.

다음 내용이 포함된 Sample.txt 파일이 있다고 가정해 보겠습니다.

$ cat sample.txt

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

그런 다음 내부 따옴표만 제거하려면 다음을 제안합니다.

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

설명하다:

sed 's/"//g'각 줄의 큰따옴표를 모두 제거하세요.

sed 's/^/"/'각 줄의 시작 부분에 큰따옴표를 추가하세요.

sed 's/$/"/'각 줄 끝에 큰따옴표를 추가하세요.

sed 's/|/"|"/g'각 파이프 앞과 뒤에 인용문을 추가하세요.

도움이 되었기를 바랍니다.

편집하다: 파이프 구분 기호 설명에 따라 명령을 약간 변경해야 합니다.

Sample.txt를 다음과 같이 설정합니다.

$ cat sample.txt

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

그런 다음 파이프라인에 대체 명령을 추가하면 최종 솔루션이 제공됩니다.

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

스크립트 옵션

이 샘플.txt 파일을 사용하세요.

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

그리고 이 스크립트는

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

당신은 이것을 얻을 것이다:

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

이것이 당신이 처리해야 할 일이기를 바랍니다.

알려줘요!

최종 편집

스크립트는 사용자가 제공한 입력 줄을 여러 번 처리합니다. 유일한 제한 사항은 20개 열이 모두 같은 행에 있어야 한다는 것입니다.

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

여기서부터는 특정 상황에 맞게 작동하도록 할 수 있어야 합니다.

답변2

필드를 편집하는 가장 간단한 기준은 "문자가 있는지 여부"입니다.
숫자(및 일부 기호 .,- 등)만 포함된 필드는 유지되어야 합니다.
이 간단한 awk 스크립트는 다음 작업을 수행합니다.

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

관련 정보