使用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