echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'
Run Code Online (Sandbox Code Playgroud)
为什么我无法获得任何输出?
谢谢.
这是gawk 4.0.0,在带有cygwin的Windows 7上运行.该程序被调用为
gawk -f procjournal.gawk testdata
Run Code Online (Sandbox Code Playgroud)
我有一些看起来像这样的数据:
"Date";"Type";"Amount";"Balance"
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46
"6/11/2013 11:51:17 AM";"Market Transaction";47500;399314311.96
"6/11/2013 11:12:42 AM";"Transaction Tax";-549.92;399266811.96
"6/11/2013 11:12:42 AM";"Market Transaction";61101.78;399267361.88
Run Code Online (Sandbox Code Playgroud)
我想提取事务的行,从第1个字段中删除日期部分,并将时间戳重新格式化为小数.我以为我可以用这个awk程序做到这一点:
FS=";"
OFS=";"
/Market Transaction/ {
split($1, itemdate, " ");
tmp = itemdate[2];
split(tmp, hms, ":");
timestamp = hms[3] + (hms[2] * 60) + (hms[1] * 3600);
if (itemdate[3] == "AM")
timestamp += 12 * 3600;
timestamp /= 3600.0;
$1 = timestamp;
print;
}
Run Code Online (Sandbox Code Playgroud)
但我的输出看起来像这样:
"Date";"Type";"Amount";"Balance"
"Date";"Type";"Amount";"Balance"
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46
"6/11/2013 11:51:17 AM";"Transaction Tax";-427.5;399313884.46 …Run Code Online (Sandbox Code Playgroud) 我有一个包含两列的数据文件.我想找出第二列的最大数据值,并将第二列的每个条目除以最大值.(所以我将在第二列中获得所有条目<= 1.00).
我尝试使用以下命令:
awk 'BEGIN {max = 0} {if ($2>max) max=$2} {print ($2/max)}' angleOut.dat
Run Code Online (Sandbox Code Playgroud)
但我得到如下错误信息.
awk: (FILENAME=angleOut.dat FNR=1) fatal: division by zero attempted
Run Code Online (Sandbox Code Playgroud)
注意:第二列中有一些数据是零值.但是当零值除以最大值时,我应该得到零,但我得到如上所述的错误.
我能得到任何帮助吗?
提前谢谢了.
我正在将GAWK脚本翻译成C#程序,我不知道GAWK脚本的哪个部分意味着什么.我已经找到了脚本的其余部分,但我似乎无法找到在哪里寻找其余的这些命令.
我没有其他.tg文件的例子,因为我正在将它复制盲目而且我需要把它弄好.
这些是:
date +"Report prepared %a %b %e %T %Y" >! $XTRAFILE
set ntg=`awk '\!/^#/{if(NF)print}' *.tg ad_tgs | wc -l`
Run Code Online (Sandbox Code Playgroud)
问题:
我是正确的,假设它把">!" 将"报告准备"放在$ XTRAFILE的顶部?
另外,我不知道"%a%b%e ..."是什么.
最后,以"set ntg"开头的行是否计算ad_tgs文件中的行?
我想对我在awk中遇到的问题提供帮助或指导.
我有一个包含超过5个字段的制表符分隔文件.我想输出除前5个字段之外的字段.
你能告诉我如何写一个awk脚本来完成这个任务吗?
最好的,jianfeng.mao
请注意以下类型的评论:
我的文件中有很多字段.不同的行具有不同数量的字段.每行的字段数不是标准的.
下面的代码替换了第一次出现的apple with banana.如何使用awk/gawk实现同样的目标?
sed -i "0,/apple/s//banana/" myfile.txt
Run Code Online (Sandbox Code Playgroud) 我想处理这个列表:(当然这只是一个摘录.)
1 S3 -> PC-8-Set
2 S3 -> PC-850-Set
3 S3 -> ANSI-Set
4 S3 -> 7-Bit-NRC
5 PC-8-Set -> S3
6 PC-850-Set -> S3
7 ANSI-Set -> S3
Run Code Online (Sandbox Code Playgroud)
这就是我做的:
awk -F '[[:blank:]]+' '{printf ("%s ", $2)}' list
这就是我得到的:
1 2 3 4 5 6 7
现在我认为量词+是等价的{1,},但当我把线改为
awk -F '[[:blank:]]{1,}' '{printf ("%s ", $2)}' list
我得到了空白,整条线读到了1美元.
有人能解释一下这种行为吗?我很感谢每一个答案!

我需要将字段的最终大小限制为2048.我可以使用:
ACTION_PARAMETER=substr($2,1,2048);
Run Code Online (Sandbox Code Playgroud)
但有更好的方法吗?
为了解决问题,我编写了以下gnu-awk脚本并遇到了排序问题(应该先阅读手册).
从手册:
由于IGNORECASE会影响字符串比较,因此IGNORECASE的值也会影响asort()和asorti()的排序.另请注意,区域设置的排序顺序不起作用; 比较仅基于字符值.
这是建议的解决方案:
awk '{
lines[$0]=length($0)
}
END {
for(line in lines) { tmp[lines[line],line] = line }
n = asorti(tmp)
for(i=1; i<=n; i++) {
split(tmp[i], tmp2, SUBSEP);
ind[++j] = tmp2[2]
}
for(i=n; i>0; i--)
print ind[i],lines[ind[i]]
}' file
aaaaa foo 9
aaa foooo 9
aaaa foo 8
aaa foo 7
as foo 6
a foo 5
aaaaaaa foooo 13
Run Code Online (Sandbox Code Playgroud)
我尝试添加0以强制数字类型,但无法达到所需的输出.有没有办法可以模拟数字排序awk/gawk?
aaa foooo
aaaaaaa foooo
a foo
aaa foo
aaaaa …Run Code Online (Sandbox Code Playgroud) 背景
均聚物是具有连续相同碱基的DNA的亚序列,如AAAAAAA.python中的示例用于提取它:
import re
DNA = "ACCCGGGTTTAACCGGACCCAA"
homopolymers = re.findall('A+|T+|C+|G+', DNA)
print homopolymers
['A', 'CCC', 'GGG', 'TTT', 'AA', 'CC', 'GG', 'A', 'CCC', 'AA']
Run Code Online (Sandbox Code Playgroud)
我的努力
我制作了一个解决问题的gawk脚本,但没有使用正则表达式:
echo "ACCCGGGTTTAACCGGACCCAA" | gawk '
BEGIN{
FS=""
}
{
homopolymer = $1;
base = $1;
for(i=2; i<=NF; i++){
if($i == base){
homopolymer = homopolymer""base;
}else{
print homopolymer;
homopolymer = $i;
base = $i;
}
}
print homopolymer;
}'
Run Code Online (Sandbox Code Playgroud)
产量
A CCC GGG TTT AA CC GG A CCC AA
题
如何在awk或sed中使用正则表达式,得到相同的结果?