Record_type(最初のフィールド)に基づいて末尾のコンマを削除する必要があります。入力ファイルには50の区切り文字があり、レコードの種類に応じて区切り文字を減らす必要があります。最初のフィールドが400の場合は最後の10個の区切り文字が削除され、300の場合は5つの区切り文字が削除され、210の場合は2つのカンマが削除されます。 400、300、210のパターンが繰り返され、順序は同じままでなければなりません。
たとえば、
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,,,,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,,,
出力が必要です。
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,
awkとsedを試しましたが、ファイル全体が切り捨てられました。
答え1
sedはあなたの要件を満たすことができます。これにより、目的の文字列の先頭に一致し、最後の任意の数のカンマが削除されます。
sed -e '/^400/ s/,\{10\}$//' -e '/^300/ s/,\{5\}$//' -e '/^210/ s/,\{2\}$//'
答え2
AWK方法。trunk
インデックス0からインデックス長(n)までの部分文字列の行全体を印刷する関数を定義します。残りは単純なパターンマッチングとtrunk
関数呼び出し、適切な数の文字の削除だけです。
ライナーとして:
$ awk -F ',' 'function trunk(n){print substr($0,0,length($0)-n)}; $1==400{trunk(10)};$1==300{trunk(5)};$1==210{trunk(2)} ' input.txt
スクリプトで見ると、次のようになります。
#!/usr/bin/awk -f
BEGIN { FS="," };
function trunk(n){
print substr($0,0,length($0)-n)
};
$1==400{ trunk(10)};
$1==300{trunk(5)};
$1==210{trunk(2)};
動作中です。
$ ./trunk_lines.awk input.txt
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,
答え3
末尾のフィールドが空の場合(またはそのフィールドも削除したい場合)
awk -F, -vOFS=, '$1=="400"{NF-=10} $1=="300"{NF-=5} $1=="210"{NF-=2} 1' file
またはスマートになりたい場合(それは良いことかもしれないし、悪いことかもしれません)
awk -F, -vOFS=, 'BEGIN{x[400]=10;x[300]=5;x[210]=2} {NF-=x[$1]} 1' file