我有一个大文件N-三元组/N-四元组
我想留下一组唯一的主题。
对于较小的文件,我可以使用以下方法实现此目的:
awk '{print $1}' | uniq
但对于大文件awk
失败 线。 (几MB)。
我怎样才能实现与sed
/ grep -o
/etc'...类似的东西?
编辑:
awk 失败并显示:
awk: program limit exceeded: maximum number of fields size=32767
FILENAME="file.nq" FNR=308254 NR=308254
答案1
[更新] 有些行有太多(空白分隔)字段。尝试grep
代替awk
:
grep -E -o '^[^[:space:]]+' your_input_file | uniq
我建议不要使用sed
它,因为它会在一个非常大的文件的每一行上做很多额外的工作(以删除行尾)。相同awk
:行解析是不必要的。
答案2
和sed
:
sed 's/^ *\([^ ]*\) .*$/\1/g' | uniq
这会将每一行替换为第一个非空格序列。
使用两个 s 的更快变体grep
(处理带有前导空格的行,如 AWK 所做的那样):
grep -o "^[[:space:]]*[^[:space:]]*" | grep -o "[^[:space:]]*" | uniq
答案3
回答编辑后的问题,用long lines
.
对于这种情况,您可以使用的一个技巧是tr
交换空格和换行符。有多种方法可以从第一行获取第一条记录。然后你的问题就变成了寻找包含空格的行
{ echo # output a newline to get the first record
cat file
} | tr ' \n' '\n ' |
sed -n '/ /s/.* //p'
或者
tr ' \n' '\n ' < file | sed -ne '1p' -e '/ /s/.* //p'
这个想法是你改变
this is a long line
and this is another
到
this
is
a
long
line and
this
is
another
因此,具有线长度限制的工具不会有问题。如果字段之间有制表符,那么您可能需要tr ' \t\n' '\n\n '