我有一个很大的(〜900MB)制表符分隔的文本文件,我将在下游程序中对其进行处理。我需要删除任何缺少值的行。每行上的列数正确(因此,缺少的值将对应于2个制表符)。
注意:我的实际数据有大约200万行和80-300列。可能的字符是AZ AZ 0-9-(连字符)_(下划线)和制表符(定界)。文件中没有空格或特殊字符。
我是这种脚本的新手,所以希望对提供的任何代码进行解释。我通常使用R,但是我的文件大小已超出R的数据处理功能。
如何在终端(或在Shell脚本中)从文件中删除缺少值的行(例如,使用sed
)?
输入文件示例:
Col1 Col2 Col3
A B C
D F
G H I
J K
示例输出文件:
Col1 Col2 Col3
A B C
G H I
如果您的字段永远不能包含空格,则空白字段表示一个制表符作为第一个字符(^\t
),一个制表符作为最后一个字符(\t$
)或两个连续的制表符(\t\t
)。因此,您可以过滤出包含以下任何内容的行:
grep -Ev $'^\t|\t\t|\t$' file
如果可以有空格,事情将会变得更加复杂。如果您的字段可以以空格开头,请改用它(它认为只有空格的字段为空):
grep -Pv '\t\s*(\t|$)|\t$|^\t' file
所做的更改会滤除与制表符匹配的行,后跟0或多个空格,然后是另一个制表符或行的末尾。
如果最后一个字段只包含空格,那也将失败。为了避免这种情况也一样,使用perl
与-F
和-a
选项来分割输入到@F
阵列中,告诉它要打印除非字段之一是空的(/^$/
):
perl -F'\t' -lane 'print unless grep{/^$/} @F' file
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句