ダウンストリームプログラムで処理するタブ区切りの大容量(〜900 MB)テキストファイルがあります。値が欠落している行を削除する必要があります。各行には正しい数の列があります(したがって、欠落している値は2つのタブに対応します)。
注:私の実際のデータには約200万行と80〜300列があります。可能な文字には、az AZ 0-9 -(ハイフン)_(アンダースコア)とタブ(区切り)が含まれます。ファイルにはスペースや特殊文字はありません。
私はこの種のスクリプトに初めて触れたので、提供されたコードの説明をいただきありがとうございます。私は通常Rを使用していますが、私のファイルサイズはRのデータ操作機能を超えました。
端末(またはシェルスクリプト)から欠落している値(usingなど)を含むファイルの行を削除するにはどうすればよいですかsed
?
入力ファイルの例:
Col1 Col2 Col3
A B C
D F
G H I
J K
出力ファイルの例:
Col1 Col2 Col3
A B C
G H I
ベストアンサー1
そしてawk
:
awk -F"\t" '$1!=""&&$2!=""&&$3!=""' file
実際にははいとても簡単です。
awk
\t
フラグで指定されたフィールド区切り文字タブで入力を分割します-F
。コンテンツフィールドにスペースがない場合でも、このオプションを省略できます。$1!=""&&...
条件です。この条件が true の場合は、awk
その行を印刷します。を書くこともできますが、'$1!=""&&$2!=""&&$3!=""{print}'
必須ではありません。何もしない場合、awksのデフォルトの動作はその行を印刷することです。ここで、fields$1
とall$2
が$3
空でない場合、つまり最初の3つのフィールドに値がある場合、条件はtrueです。
別のファイルに書き込むには、次のコマンドを使用します。
awk -F"\t" '$1!=""&&$2!=""&&$3!=""' input_file >output_file
編集するawk
:未定義の列数の場合は、行のすべてのフィールドを確認するためにこのコマンドを使用できます。
awk -F"\t" '{for(i=1;i<=NF;i++){if($i==""){next}}}1' file