Y 列と Z 列が NULL でない場合は、特定の数の文字を残して X 列を切り捨てます。

Y 列と Z 列が NULL でない場合は、特定の数の文字を残して X 列を切り捨てます。

awk / sedを使用してcsvをフィルタリングして、特定の列(列1など)の値を切り取り、最後の8文字を保持し、先頭をワイルドカードに置き換える方法を見つけようとしています。列がNULLと等しくありません。たとえば、列3と5

データ例:

1597012957a0dg9a0t593qa_filename1.exe,NULL,NULL,DATA,NULL,DATA
asvasihtiqsafsoithqwtoihwoi_filename2.exe,NULL,DATA,DATA,DATA,DATA

になります:

1597012957a0dg9a0t593qa_filename1.exe,NULL,NULL,DATA,NULL,DATA
*.filename2.exe,NULL,DATA,DATA,DATA,DATA

私は一連のパイピングを使ってrevこのスクリプトを書いていますが、非常に非効率的で、多くのデータで作業し、スクリプトに数時間かかるので、より高度な/フィルタをcut学んでいます。awksed

ベストアンサー1

awk -v c=8 'BEGIN{ FS=OFS="," }
$3!="NULL" && $5!="NULL"{ $1=(length($1)>c?"*"substr($1,length($1)-c+1):$1) }1' infile

ここではc=#、列#1の長さが8文字を超える場合にのみ「*」を追加し(保持する文字数を変更できます)、それ以外の場合は列#1を変更せずに印刷します。

おすすめ記事