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
学んでいます。awk
sed
ベストアンサー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を変更せずに印刷します。