UNIX 스크립트에서 구조화되지 않은 레코드를 구조화된 레코드로 구성

UNIX 스크립트에서 구조화되지 않은 레코드를 구조화된 레코드로 구성

사용유닉스 시스템개발할 다음 코드를 작성합니다.

다음 데이터가 포함된 20-40GB 파일이 있습니다. 샘플 기록을 제공하세요.

AUTO="text1" CAR="its mine" LORRY="commercial vehicle" CART="simple " BULLCART="same old one simple with bull" TRUCK="Multi purpose"
AUTO="text2" BUS="commercial vehicle" LORRY="its a vehicle" CART="without bull" BULLCART="with bull" TRUCK="Multi purpose"
AUTO="text3" BUS="commercial vehicle" CAR="Personal" LORRY="mini one ?" BULLCART="bull" TRUCK="Multi purpose"
AUTO="" CART="simple without bull" BULLCART="nothing spl with bull" TRUCK="Multi purpose"
AUTO="long text" BUS="commercial vehicle" CAR="jubel" BULLCART="" TRUCK="Multi purpose"
AUTO="message" CAR="others" LORRY="commercial vehicle" BULLCART="not null" TRUCK="Multi purpose"
AUTO="cleverwiz" BUS="commercial vehicle" CAR="yours" LORRY="max vehicle" CART="bull is there" TRUCK="Multi purpose"
AUTO="passengers only" BUS="commercial vehicle" CAR="ramsoh" LORRY="maintainable " CART="old one" BULLCART="simple with bull" 

필드 순서는 AUTO, BUS, CAR, LORRY, CART, BULLCART, TRUCK입니다.

예상되는 출력은 CAR이 없으면 세 번째 필드 CAR=""를 삽입해야 하고, LORRY가 없으면 LORRY=""를 네 번째 필드로 삽입해야 한다는 것입니다.

첫 번째 레코드를 보면 BUS가 존재하지 않는 경우 두 번째 필드에 BUS=""를 삽입해야 합니다. 따라서 출력은 다음과 같습니다.

AUTO="text1" BUS="" CAR="its mine" LORRY="commercial vehicle" CART="simple " BULLCART="same old one simple with bull" TRUCK="Multi purpose"

네 번째 레코드인 BUS, CAR, LORRY가 존재하지 않으므로 BUS="" CAR=""를 삽입해야 합니다. 출력은 다음과 같습니다

AUTO="" BUS="" CAR="" LORRY="" CART="simple without bull" BULLCART="nothing spl with bull" TRUCK="Multi purpose"

답변1

기성 솔루션을 버리는 것이 좋지 않다고 말할 수도 있지만, 물어보면 그렇습니다. 여기 있어요:

#!/bin/bash


#  AUTO, BUS, CAR, LORRY, CART, BULLCART, TRUCK

get_param(){
    param=`echo $1|sed -E  '/.*\b('$2'\=\"[^"]*\").*/!d;s/.*\b('$2'\=\"[^"]*\").*/\1/'`

    if [ -z "$param" ]; then 
        param=$2'=""'
    fi
    echo $param;
}
process_line(){
    auto=`get_param "$1" 'AUTO'`
    bus=`get_param "$1" 'BUS'`
    car=`get_param "$1" 'CAR'`
    lorry=`get_param "$1" 'LORRY'`
    cart=`get_param "$1" 'CART'`
    bullcart=`get_param "$1" 'BULLCART'`
    truck=`get_param "$1" 'TRUCK'`
    echo $auto $bus $car $lorry $cart $bullcart $truck 
}

while read LINE;do
        process_line "$LINE"
done < source.txt

관련 정보