列値に基づいてファイルの行をグループ化する

列値に基づいてファイルの行をグループ化する

以下に「csv」スプレッドシートがあります。

abc,12345,qwerty,A
xyz,12380,qwetty,R
abc,12389,qwerty,A
xyz,12324,qwetty,R

列1、2、および4で同じ値を持つ行をマージしたいと思います。また、3列の最後の2文字を「**」に変更したいと思います。出力例は次のとおりです。

abc,123**,qwerty,A
abc,123**,qwerty,A
xyz,123**,qwetty,R
xyz,123**,qwetty,R

総ライン数が100万ラインを超えています!

答え1

まず、col1、col2、col4の順にファイルを並べ替えるには、次の手順を実行します。

$ sort -t, -k1,1 -k2,2 -k4,4 file
abc,12345,qwerty,A                                                                                        
abc,12389,qwerty,A
xyz,12324,qwetty,R
xyz,12380,qwetty,R

次に、2番目のフィールドを難読化するには、次のようにします。

$ sort -t, -k1,1 -k2,2 -k4,4 file | sed 's/..,/**,/2'
abc,123**,qwerty,A                                                                                        
abc,123**,qwerty,A
xyz,123**,qwetty,R
xyz,123**,qwetty,R

答え2

sort file | awk -F',' '{ sub(/..$/,"**",$2) }1' OFS=','
abc,123**,qwerty,A
abc,123**,qwerty,A
xyz,123**,qwetty,R
xyz,123**,qwetty,R

カンマ区切り文字をタブ文字に変更する場合。次のコマンドを使用できます。

sort file | sed 's/,/\t/g' | awk -F'\t' '{ sub(/..$/,"**",$2) }1' OFS='\t'
abc 123**   qwerty  A
abc 123**   qwerty  A
xyz 123**   qwetty  R
xyz 123**   qwetty  R

関連情報