Unixでは、カンマ区切りのファイル内の特定の場所にある文字と数字を削除します。

Unixでは、カンマ区切りのファイル内の特定の場所にある文字と数字を削除します。

Unixでは、カンマ区切りのファイルの特定の場所から文字と数字を削除したいと思います。

私のデータはこんな感じです

jagan1,*,*,*,*,*,W,24,25,26
jagan2,*,*,*,*,*,1,24,25,26
jagan3,*,*,*,*,*,*,24,25,26
jagan4,*,*,*,*,*,P,24,25,26
jagan5,*,*,*,*,*,*,24,25,26

7番目の位置では*だけを保持し、数字や文字があれば行全体を削除したいと思います。

次のように出力

jagan3,*,*,*,*,*,*,24,25,26
jagan5,*,*,*,*,*,*,24,25,26

答え1

簡単にawkスクリプト:

$ awk -F, '$7 == "*"' file.csv
jagan3,*,*,*,*,*,*,24,25,26
jagan5,*,*,*,*,*,*,24,25,26

  • -F,-,入力フィールド区切り文字で(カンマ)を設定します。
  • '$7 == "*"' - 7番目のフィールドは次の行のみを考慮します。*

消す不要行は以下を使用sed方法:

$ sed -Ei '/^([^,]+,){6}[^*],/d' file.csv

答え2

そしてミラー-Iファイルを任意の場所で編集するオプションを含めます。

mlr -I --csv --implicit-csv-header --headerless-csv-output filter '$7 == "*"' file.csv

答え3

入力ファイルがあり、in.txt7番目の列にアスタリスクがある行をそのファイルにコピーするには、out.txt次のgrepコマンドを使用します。

grep -E '^(([[:alnum:]]+|[*]),){6}\*' in.txt > out.txt

説明:最初に行の先頭(^)を見てから、6つの連続した行を見てください。英数字またはアスタリスクコンマ ( (([[:alnum:]]+|[*]),);{6}は反復回数を定義します) が続き、次の文字がアスタリスクであることを確認します。その場合、一致する行がにコピーされますout.txt

答え4

今回は、以下を試してみてください。

sed -i -Ee 's/^.*,[a-zA-Z0-9]*,[0-9]{2},[0-9]{2},[0-9]{2}$//' file && sed -i '/^$/d' file

フォーマットされた文字列をキャプチャし...,<number or character>,<two numbers>,<two numbers>,<two numbers><end of line>て削除します。


空行を削除

'/^$/d'

関連情報