sedは、n番目の文字が特定の文字ではない場合、行を削除します。

sedは、n番目の文字が特定の文字ではない場合、行を削除します。

csvファイルがあり、12文字目以外の場合は行を削除したいと思います;

たとえば、私のファイルは次のようになります。

2266308;A;B;dfsgsfdg    
2266309;A;BJHSADFK;gfsdg
2266310;A;B;dfg

そして私はほしい:

2266308;A;B;dfsgsfdg
2266310;A;B;dfg

12番目の文字がsedの文字ではない場合、この行をどのように削除しますか;? =)

答え1

12 文字目以外のすべての行を削除するには;:

 $ sed -E '/^.{11}[^;]/d' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

または、ソースファイルを編集します(sedサポートされている場合-i)。

$ sed -iE '/^.{11}[^;]/d' file

sedサポートしていない場合-E

sed -i '/^.\{11\}[^;]/d' file

しかし、csvファイルなので、文字数の代わりにフィールドを使用する方がはるかに安全です。たとえば、awk3 番目のフィールドが 1 文字の長さのすべての行を印刷するには、次のように指示します。

$ awk -F';' 'length($3)==1' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

最新のGNU awkを使用すると、ファイルを任意の場所で編集できます。

 awk -iinplace -F';' 'length($3)==1' file

これは、前のフィールドの長さの変化に強いという利点がある。このsed方法とは異なり、行に空白がある場合、または最初の 2 つのフィールドのいずれかが予想より長いか短い場合は失敗しません。通常、データがフィールドで区切られている場合は、文字位置よりもフィールドを使用することをお勧めします。

関連情報