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ファイルなので、文字数の代わりにフィールドを使用する方がはるかに安全です。たとえば、awk
3 番目のフィールドが 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 つのフィールドのいずれかが予想より長いか短い場合は失敗しません。通常、データがフィールドで区切られている場合は、文字位置よりもフィールドを使用することをお勧めします。