UNIXスクリプトで構造化されていないレコードを構造化レコードとして構成する

UNIXスクリプトで構造化されていないレコードを構造化レコードとして構成する

使用Unixシステム開発する次のコードを記述します。

次のデータを含む20〜40 GBのファイルがあります。サンプル履歴を提供してください。

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がない場合は3番目のフィールドCAR = ""を挿入し、LORRYがない場合はLORRY = ""を4番目のフィールドに挿入する必要があることです。

最初のレコードを見ると、BUSが存在しない場合は、2番目のフィールドにBUS = ""を挿入する必要があります。したがって、出力は次のようになります。

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

4番目のレコード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

関連情報