Bash 加速我的awk命令?答案必须是awk:)

Bash 加速我的awk命令?答案必须是awk:),bash,split,awk,gsub,Bash,Split,Awk,Gsub,我有一些awk代码运行得非常慢。我的文件格式是以制表符分隔的5列ASCII。我对第5列进行操作,以获得适当的字符数,从而改变第4列中的值 输入行示例: 10 5134832 N 28 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 如果我

我有一些awk代码运行得非常慢。我的文件格式是以制表符分隔的5列ASCII。我对第5列进行操作,以获得适当的字符数,从而改变第4列中的值

输入行示例:

10 5134832 N 28 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

如果我在$5中找到任何“^”,我不想计算它,或以下字符。
然后我想知道有多少个字符是“>”或“正如我所看到的,你的
gsub
模式将不起作用,因为
/
没有关闭。无论如何,如果我得到的是正确的,并且你希望
$5
的字符计数没有一些字符,我会选择:

count=length(gensub("[><A-Z^]","","g",$5))

count=length(gensub(“[>正如我所看到的,您的
gsub
模式将无法工作,因为
/
未关闭。无论如何,如果我正确获取它,并且您希望
$5
的字符计数不包含一些字符,我会选择:

count=length(gensub("[><A-Z^]","","g",$5))
count=length(gensub(“[>这里是一个猜测:

awk '
    BEGIN {FS = OFS = "\t"}
    {
        str = $5
        gsub(/\^.|[><*]/, "", str)
        l = length(str)
    }
'
awk'
开始{FS=OFS=“\t”}
{
str=5美元
gsub(/\^.|[>这里有一个猜测:

awk '
    BEGIN {FS = OFS = "\t"}
    {
        str = $5
        gsub(/\^.|[><*]/, "", str)
        l = length(str)
    }
'
awk'
开始{FS=OFS=“\t”}
{
str=5美元

gsub(/\^.[>您需要使用
awk
,还是改为使用它

cut -f 5 < $file | grep -v '^[A-Z]' | tr -d '<>*\n' | wc -c
cut-f5<$file | grep-v'^[A-Z]'| tr-d'*\n'| wc-c
翻译:

  • 从制表符分隔的
    $file
    中提取第5个字段
  • 删除所有以大写字母开头的字段
  • 删除字符
    *
    和换行符
  • 计算剩余的字符数

您是否需要使用
awk
,还是可以改为使用

cut -f 5 < $file | grep -v '^[A-Z]' | tr -d '<>*\n' | wc -c
cut-f5<$file | grep-v'^[A-Z]'| tr-d'*\n'| wc-c
翻译:

  • 从制表符分隔的
    $file
    中提取第5个字段
  • 删除所有以大写字母开头的字段
  • 删除字符
    *
    和换行符
  • 计算剩余的字符数

    • 这可能适合您:

      echo "10 5134832 N 28 Aaaaa*AAAAaAAAaAAAAaAAAA^]a^]a^Fa^]a" |
      awk '/[><*^]/{t=$5;gsub(/[><*]|[\^]./,"",t);$4=length(t)}1' 
      10 5134832 N 27 Aaaaa*AAAAaAAAaAAAAaAAAA^]a^]a^Fa^]a
      
      echo“10 5134832 N 28 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
      
      awk'/[>这可能适合您:

      echo "10 5134832 N 28 Aaaaa*AAAAaAAAaAAAAaAAAA^]a^]a^Fa^]a" |
      awk '/[><*^]/{t=$5;gsub(/[><*]|[\^]./,"",t);$4=length(t)}1' 
      10 5134832 N 27 Aaaaa*AAAAaAAAaAAAAaAAAA^]a^]a^Fa^]a
      
      echo“10 5134832 N 28 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
      
      awk'/[>谢谢Zsolt。增加的技巧是,除了省略一些单个字符外,我还想省略“^[A-Z]”的任何字符对。你所说的字符对是什么意思?我编辑了这个问题以显示我所说的字符对。上面我想省略“^]”和“^F”“从我的计数中。谢谢Zsolt。增加的技巧是,除了省略一些单个字符外,我还想省略“^[A-Z]”的任何字符对。你所说的字符对是什么意思?我编辑了这个问题以显示我所说的字符对。上面我想省略“^]”和“^F”根据我的计算。我需要使用awk,因为这是一个更大的awk命令的一部分。好的。但是在发布答案后不公平地更改问题中的规格!;-)我需要使用awk,因为这是一个更大的awk命令的一部分。好的。但是在发布答案后不公平地更改问题中的规格!;-)所以一般来说,多个字符上的gsub应该比多个拆分快?@lonestar21,不知道,试试看。有了多个拆分,awk必须在内存中创建多个数组。所以一般来说,多个字符上的gsub应该比多个拆分快?@lonestar21,不知道,试试看。有了多个拆分,awk必须创建mul内存中有多个数组。