Questions tagged «awk»

一种模式导向的扫描和处理语言。

2
不使用“ e”来操纵科学格式
我正在尝试处理一个包含以科学计数法表示的数字但没有e符号(即1.2e+3写为)的文件1.2+3。 我想到的最简单的方法awk是使用函数替换+为e+,gsub并在新文件中进行计算。减号情况也是如此。因此,可以使用以下命令完成简单的修复 awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in 并在所有列中执行相同操作。 但是,该文件还包含负数,这使事情变得更加复杂。可以看到一个示例文件 1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6 2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4 3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6 4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6 6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5 7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5 9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5 9.248130+1 5.000000-1 3.069610-3 …

1
通过字符串引用数组元素,并在awk中初始化数组
#!/usr/bin/env bash awk ' BEGIN { arr[A]=1; arr[B]=1; arr[C]=1; arr[E]=1; arr[J]=8; arr[Q]=10; print arr[J] }' 上面的命令输出的最新设置值arr['subscript'],在这种情况下10,它是arr[Q]之前的值,print而不是。8arr[J] 另外,就像上面的脚本一样,我不想一次为一行arr['A'], arr['B'], arr['C'] and arr['E']具有相同值的值赋值1,而是将下标数组作为参数之一传递给公共值,并将公共值作为另一个参数传递给处理函数为他们分配价值的逻辑。
8 awk  array 

3
删除文本文件的一部分并使用sed跟随以下行
我需要编辑如下文件: auto wlx00 allow-hotplug wlx00 iface wlx000 inet dhcp iface wlx000 inet6 auto post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2 auto wlx000 目标是删除以'iface ... inet6'开头的行,并删除以空格开头的下几行(可以是一个或多个): iface wlx000 inet6 auto post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2 并保持其余状态不变,以得到以下结果: auto wlx00 allow-hotplug wlx00 iface wlx000 inet dhcp auto wlx000 我尝试使用sed,如下所示: sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile 但它会删除从正确位置开始到擦除为止的所有内容。我只想删除选择iface文本后以空格开头的线条。

4
按空格定界,但忽略反斜杠空格
5678 [] testing,\ group [] [testing [] ip\ 5.6.7.8 [] launch-wizard-1 0.0.0.0/0 456dlkjfa [] 1.2.3.4 [] test 1.2.3.4/32 4.3.2.0/23 4.3.2.0/23 default 4.3.2.0/23 4.3.2.0/23 launch-wizard-2 0.0.0.0/0 launch-wizard-3 0.0.0.0/0 2.3.4.5/32 [] 我想获取上面的第一列,但要注意的是,我需要将\ (反斜杠)作为该列的一部分,因此awk '{print $1}'应该给我 5678 testing,\ group [testing ip\ 5.6.7.8 launch-wizard-1 456dlkjfa 1.2.3.4 test default launch-wizard-2 launch-wizard-3 2.3.4.5/32

2
如何通过具有公共头合并两个文件的行?
我想基于两个文件中的公共数据合并它们作为标题。 以下是示例 文件1 >Feature scaffold1 1 100 g 101 200 g 201 300 g >Feature scaffold2 1 100 g 01 500 g >Feature scaffold3 10 500 g >Feature scaffold4 10 300 g 文件2 >Feature scaffold1 500 500 r 900 1000 r >Feature scaffold2 200 300 r >Feature scaffold3 100 200 …

4
如何在bash中移动数组值
我们要构建6个挂载点文件夹作为示例 /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg 所以我们使用数组编写了这个简单的bash脚本 folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 现在我们要更改不带计数器的代码,并让= $ counter = counter + 1 是否有可能转移每个循环数组以获得下一个数组值? 像 ${folderArray[++]}

2
如何使用sed或awk将字符串添加到.txt文件中的所有行中,除了少数字符外
我有一个名为的文本文件xid.txt: xid: SC48028 id: artf398444 xid: indv1000 id: indv24519 xid: SC32173 id: artf398402 xid: SC21033 id: artf398372 xid: 1001 id: tracker4868 xid: wiki1000 id: wiki10709 xid: proj1234 id: proj12556 我需要在'SC48028','SC32173'...之前添加字符串'PT_'。字符串“ SC ...”可以任何组合开头,可以是“ AC ...”或“ DL ..” 要求的输出: xid: PT_SC48028 id: artf398444 xid: indv1000 id: indv24519 xid: PT_SC32173 id: artf398402 xid: …

2
检测可选函数参数(标量)
考虑以下脚本: function alfa(bravo, charlie) { if (charlie) return "charlie good" else { return "charlie bad" } } BEGIN { print alfa(1, 1) print alfa(1, 0) print alfa(1, "") print alfa(1) } 结果: charlie good charlie bad charlie bad charlie bad Awk是否可以告诉何时未提供参数?


6
将一列中的所有值替换为1
我有多个包含12行和3列的文本文件。 例: 2 6 0.74 42 6 0.58 80 6 0 112 6 0.24 132 6 1 216 6 0.7 342 6 0 390 6 0.21 432 6 0.56 466 6 0.75 524 6 0.6 646 6 0.9 我想在所有行中将第三列的所有值设置为1。 输出应如下所示: 2 6 1 42 6 1 80 6 1 112 …


1
在awk脚本中陷阱Ctrl-C
我相信Ctrl- C可以陷入bash脚本中。是否也可以将其捕获在Awk脚本中以处理该事件? 例如,对于中止处理,而是打印已经处理过的结果,而不是仅静默退出?

5
如何以编程方式检测awk风味(例如gawk vs nawk)
我使用的命令行应用程序实质上是bash shell脚本的集合。该应用程序被编写为可以在BSD / OSX和Linux上运行。其中一个脚本依赖于awk。它包含两个awk命令:一个是为nawk编写的(标准BSD awk实现),另一个是为gawk编写的(GNU awk实现)。 有问题的两个awk命令与不同的环境不兼容。特别是当与gawk一起运行时,nawk命令失败。该脚本检查内核名称(即uname -s)以确定主机环境,然后运行适当的awk命令。但是,我更喜欢在安装了GNU核心实用程序的Mac OS X上工作,因此脚本无法正确运行。 在思考如何最好地修复此错误的过程中,我想到,很高兴知道如何以编程方式区分常见命令行实用程序的不同样式,最好以相对健壮和可移植的方式进行区分。 我注意到nawk不接受'-V'标志来打印版本信息,因此我认为应该执行以下操作: awk -V &>/dev/null && echo gawk || echo nawk 另一个变化可能是: awk -Wversion &>/dev/null && echo gawk || echo nawk 这似乎适用于我的两个测试环境(OS X和CentOS)。这是我的问题: 这是最好的方法吗? 有没有一种方法可以扩展它以处理awk的其他变体(例如,awkk,jawk等)? 甚至值得担心其他版本的awk吗? 我还应该提到我对awk知之甚少。


3
awk没有结束
我在名为的文件中包含以下代码awktest1.awk: #!/bin/awk -f BEGIN{print "start"} {print $2, "\t", $5} END{print "end"} employee.txt 其中employee.txt包含以下数据: 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000 我将awk命令运行为: awk -f awktest1.awk 但它只是打印start而不会结束。有人可以帮我解决我在这里做错的事情吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.