标签: gawk

如何使用不同颜色的不同字段打印awk的结果?

该文件有3个字段.我想要例如绿色的前两个字段,白色的第三个字段(NB:黑色背景),所以我试过:

awk '{print "\033[0;32m"$1"\033[0m", "\033[0;32m"$2"\033[0m", "\033[0;37m"$3"\033[0m"} }' chrono.txt
Run Code Online (Sandbox Code Playgroud)

一切都是绿色的......

我该如何进行(如果可能的话)?

awk gawk

15
推荐指数
2
解决办法
2万
查看次数

使用AWK对关联数组进行排序

这是我的数组(gawk脚本):

myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11
Run Code Online (Sandbox Code Playgroud)

排序后,我需要以下结果:

bob    5
jack   11
peter  32
john   463
Run Code Online (Sandbox Code Playgroud)

当我使用"asort"时,索引会丢失.如何按数组值排序而不丢失索引?(我需要根据它们的值排序索引)

(我需要仅使用awk/gawk获取此结果,而不是shell脚本,perl等)

如果我的帖子不够清楚,这里有另一篇文章解释同一个问题:http://www.experts-exchange.com/Programming/Languages/Scripting/Shell/Q_26626841.html)

提前致谢

更新:

多亏了你们两个,但我需要按值排序,而不是索引(我希望根据它们的值排序索引).

换句话说,我需要这个结果:

bob    5
jack   11
peter  32
john   463
Run Code Online (Sandbox Code Playgroud)

不是:

bob 5
jack 11
john 463
peter 32
Run Code Online (Sandbox Code Playgroud)

(我同意,我的例子令人困惑,选择的价值非常糟糕)

从Catcall的代码中,我编写了一个可行的快速实现,但它相当难看(我在排序和分割之前将键和值连接在一起).这是它的样子:

function qsort(A, left, right,   i, last) {
  if (left >= right)
    return
  swap(A, left, left+int((right-left+1)*rand()))
  last = left
  for (i = left+1; i <= right; i++)
    if (getPart(A[i], …
Run Code Online (Sandbox Code Playgroud)

awk gawk asort

14
推荐指数
3
解决办法
1万
查看次数

awk中的字段分隔符可以包含多个字符吗?

我可以使用由多个字符组成的字段分隔符吗?就像我想要将包含引号和逗号的单词分开即可.

"学校","大学","城市"

所以在这里我想把我的FS设置为",".但是当我像这样定义我的FS时,我得到了有趣的结果.这是我的代码片段.

awk -F\",\" '
{
for(i=1;i<=NF;i++)
  {
    if($i~"[a-z0-9],[a-z0-9]") 
    print $i
  }
}' OFS=\",\"  $* 
Run Code Online (Sandbox Code Playgroud)

awk gawk

14
推荐指数
3
解决办法
3万
查看次数

看看下一行,但不要消耗它

getline读取下一行并将NR计数器递增1.使用后getline,awk继续使用下一行.在大多数情况下,这是期望的行为.

在我的特殊情况下,我只需要查看下一行,根据其内容我读下一行或者我需要回溯一行.

我怎样才能回溯一行awk?我尝试NR手动设置计数器,NR=NR-1但这不起作用.或者是否有一种方法只能在不改变的情况下查看下一行NR

我需要一行前瞻.简单地将行保存在变量中并在以后引用它在这种情况下不起作用.我正在尝试实现一个有文化的编程工具awk,其中主文件可能包含许多子文件.这样的子文件以一行开头"% file:file1".如果到达具有较低缩进的行或具有类似行的另一行,则到达此文件的结尾"% file:file2".

/% file:/当我已经使用getline读取此行时,不使用所有行匹配的规则集.这就是为什么我想重置NR到前一行,然后awk再次读取行匹配/% file:/,并执行相应的规则.

awk gawk

13
推荐指数
2
解决办法
1万
查看次数

有没有办法完全删除awk中的字段,以便不打印额外的分隔符?

请考虑以下命令:

gawk -F"\t" "BEGIN{OFS=\"\t\"}{$2=$3=\"\"; print $0}" Input.tsv
Run Code Online (Sandbox Code Playgroud)

当我设置$ 2 = $ 3 =""时,获得与写入相同效果的预期效果:

print $1,$4,$5...$NF
Run Code Online (Sandbox Code Playgroud)

然而,实际发生的是我得到两个空字段,额外的字段分隔符仍在打印.

是否有可能实际删除2美元和3美元?

注意:如果这是在Linux上bash,上面的正确语句如下,但Windows不能很好地处理单引号cmd.exe.

gawk -F'\t' 'BEGIN{OFS="\t"}{$2=$3=""; print $0}' Input.tsv
Run Code Online (Sandbox Code Playgroud)

awk gawk

13
推荐指数
3
解决办法
5812
查看次数

使用gawk解析CSV文件

你如何使用gawk解析CSV文件?简单设置FS=","是不够的,因为带有逗号的引用字段将被视为多个字段.

使用的示例FS=","不起作用:

文件内容:

one,two,"three, four",five
"six, seven",eight,"nine"
Run Code Online (Sandbox Code Playgroud)

gawk脚本:

BEGIN { FS="," }
{
  for (i=1; i<=NF; i++) printf "field #%d: %s\n", i, $(i)
  printf "---------------------------\n"
}
Run Code Online (Sandbox Code Playgroud)

输出不好:

field #1: one
field #2: two
field #3: "three
field #4:  four"
field #5: five
---------------------------
field #1: "six
field #2:  seven"
field #3: eight
field #4: "nine"
---------------------------
Run Code Online (Sandbox Code Playgroud)

期望的输出:

field #1: one
field #2: two
field #3: "three, four"
field #4: five
---------------------------
field #1: "six, seven"
field …
Run Code Online (Sandbox Code Playgroud)

csv bash awk gawk

12
推荐指数
2
解决办法
2万
查看次数

GAWK脚本 - 在BEGIN部分打印文件名

我正在写一个开始的gawk脚本

#!/bin/gawk -f
BEGIN { print FILENAME }
Run Code Online (Sandbox Code Playgroud)

我正在调用文件,./script file1.html但脚本只返回任何内容.有任何想法吗?

linux bash shell awk gawk

10
推荐指数
3
解决办法
5466
查看次数

AWK:两次完成文件,执行不同的任务

我正在处理一个相当大的推文集合,我想为每条推文获取其提及(其他用户的名字,前缀为一个@),如果提到的用户也在文件中:

users = new Dictionary()
for each line in file:
   username = get_username(line)
   userid   = get_userid(line)
   users.add(key = userid, value = username)
for each line in file:
   mentioned_names = get_mentioned_names(line)
   mentioned_ids = mentioned_names.map(x => if x in users: users[x] else null)
   print "$line | $mentioned_ids"
Run Code Online (Sandbox Code Playgroud)

我已经使用GAWK处理该文件,因此不再在Python或CI中再次处理它,而是决定尝试将其添加到我的AWK脚本中.但是,我无法找到一种方法来传递相同的文件,为每个文件执行不同的代码.大多数解决方案都意味着多次调用AWK,但后来我放弃了我在第一遍中创建的关联数组.

我可以用非常黑客的方式做到这一点(比如cat'将文件sed复制两次,将其传递给每个文件中的所有行添加不同的前缀cat),但我希望能在几个月内理解这些代码讨厌自己

AWK的做法是什么?

PD:

我找到的不那么可怕的方式:

function rewind(    i)
{
    # from https://www.gnu.org/software/gawk/manual/html_node/Rewind-Function.html
    # shift remaining arguments up
    for (i = ARGC; i > ARGIND; i--)
        ARGV[i] = …
Run Code Online (Sandbox Code Playgroud)

awk gawk

9
推荐指数
1
解决办法
2961
查看次数

将固定宽度的文件从文本转换为csv

我有一个文本格式的大型数据文件,我想通过指定每个列长度将其转换为csv.

列数= 5

列长

[4 2 5 1 1]
Run Code Online (Sandbox Code Playgroud)

样本观察:

aasdfh9013512
ajshdj 2445df
Run Code Online (Sandbox Code Playgroud)

预期产出

aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
Run Code Online (Sandbox Code Playgroud)

linux csv awk gawk export-to-csv

9
推荐指数
2
解决办法
6225
查看次数

单个空格作为字段分隔符与awk

我正在处理一个文件,其中字段由单个空格分隔.

awk将FS解释" "为"一个或多个空格",当其中一个字段为空时,它会误读我的文件.

我尝试使用"没有空格的空格"(" (?! )")作为FS,但是awk不支持负向前瞻.简单的谷歌查询,如"单一空间字段分隔符awk"只发送到手册页解释特殊处理FS=" ".我一定错过了相关的手册页......

如何使用单个空格作为awk字段分隔符?

awk gawk

9
推荐指数
1
解决办法
3万
查看次数

标签 统计

awk ×10

gawk ×10

bash ×2

csv ×2

linux ×2

asort ×1

export-to-csv ×1

shell ×1