使用 sed/awk 检索每行中的第一个“非空格标记”

使用 sed/awk 检索每行中的第一个“非空格标记”

我有一个大文件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 '

相关内容