2

この種のテキスト ファイルを取得しました: id;firstname;client;invoice;comments (これは例です)

001;peter;35621;C132;foo
002;jane;12345;A546;
003;robert;78945;Z456;some comments
001;peter;35621;Y456;blabla
004;terry;89740;T897;
003;robert;78945;L546;bar

私がやりたいのは、クライアントに応じて、各行の最後にある別のフィールドに請求書フィールドを連結することです。私はbashまたはunix cliツール(awk、sed、cutなど...)のみを使用できます。この場合、次を生成する必要があります:

001;peter;35621;C132;foo;;C132/Y456
002;jane;12345;A546;;A546
003;robert;78945;Z456;some comments;Z456/L546
001;peter;35621;Y456;blabla;C132/Y456
004;terry;89740;T897;;T897
003;robert;78945;L546;bar;Z456/L546

私がこれまでに行ったこと: (しかし、本当に醜いように見えるので、結果には本当に満足していません)

#!/bin/bash

file="myfile.txt"

while IFS=\; read id firstname client invoice comments
do
    catInvoice=""
    while IFS=\; read xid xfirstname xclient xinvoice xcomments
    do
        if [ $client == $xclient ]
            then
                catInvoice="$catInvoice/$xinvoice"
        fi
    done < $file
    catInvoice=`echo $catInvoice | sed 's/^\///'`
    echo "$id;$firstname;$client;$invoice;$comments;$catInvoice"
done < $file

助言がありますか ?ありがとう。

4

1 に答える 1

2

ファイルへの2つのパスですが、トリックを行います:

awk '
BEGIN{FS=OFS=";"}
NR==FNR{a[$2]=(a[$2])?a[$2]"/"$4:$4;next}
{print $0,a[$2]}' textfile textfile

出力: サンプル ファイルにタイプミスがあると仮定します (つまり、Robert には、出力に表示される L546 請求書がありません。

$ cat textfile 
001;peter;35621;C132;foo
002;jane;12345;A546;
003;robert;78945;Z456;some comments
001;peter;35621;Y456;blabla
004;terry;89740;T897;
003;robert;78945;L546;bar

$ awk 'BEGIN{FS=OFS=";"}NR==FNR{a[$2]=(a[$2])?a[$2]"/"$4:$4;next}{print $0,a[$2]}' textfile textfile
001;peter;35621;C132;foo;C132/Y456
002;jane;12345;A546;;A546
003;robert;78945;Z456;some comments;Z456/L546
001;peter;35621;Y456;blabla;C132/Y456
004;terry;89740;T897;;T897
003;robert;78945;L546;bar;Z456/L546
于 2013-06-26T20:28:18.603 に答える