Bash 加速我的awk命令?答案必须是awk:)
我有一些awk代码运行得非常慢。我的文件格式是以制表符分隔的5列ASCII。我对第5列进行操作,以获得适当的字符数,从而改变第4列中的值 输入行示例: 10 5134832 N 28 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 如果我在$5中找到任何“^”,我不想计算它,或以下字符。Bash 加速我的awk命令?答案必须是awk:),bash,split,awk,gsub,Bash,Split,Awk,Gsub,我有一些awk代码运行得非常慢。我的文件格式是以制表符分隔的5列ASCII。我对第5列进行操作,以获得适当的字符数,从而改变第4列中的值 输入行示例: 10 5134832 N 28 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 如果我
然后我想知道有多少个字符是“>”或“正如我所看到的,你的
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内存中有多个数组。