该文件有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)
一切都是绿色的......
我该如何进行(如果可能的话)?
这是我的数组(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) 我可以使用由多个字符组成的字段分隔符吗?就像我想要将包含引号和逗号的单词分开即可.
"学校","大学","城市"
所以在这里我想把我的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) getline读取下一行并将NR计数器递增1.使用后getline,awk继续使用下一行.在大多数情况下,这是期望的行为.
在我的特殊情况下,我只需要查看下一行,根据其内容我读下一行或者我需要回溯一行.
我怎样才能回溯一行awk?我尝试NR手动设置计数器,NR=NR-1但这不起作用.或者是否有一种方法只能在不改变的情况下查看下一行NR?
我需要一行前瞻.简单地将行保存在变量中并在以后引用它在这种情况下不起作用.我正在尝试实现一个有文化的编程工具awk,其中主文件可能包含许多子文件.这样的子文件以一行开头"% file:file1".如果到达具有较低缩进的行或具有类似行的另一行,则到达此文件的结尾"% file:file2".
/% file:/当我已经使用getline读取此行时,不使用所有行匹配的规则集.这就是为什么我想重置NR到前一行,然后awk再次读取行匹配/% file:/,并执行相应的规则.
请考虑以下命令:
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) 你如何使用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) 我正在写一个开始的gawk脚本
#!/bin/gawk -f
BEGIN { print FILENAME }
Run Code Online (Sandbox Code Playgroud)
我正在调用文件,./script file1.html但脚本只返回任何内容.有任何想法吗?
我正在处理一个相当大的推文集合,我想为每条推文获取其提及(其他用户的名字,前缀为一个@),如果提到的用户也在文件中:
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的做法是什么?
我找到的不那么可怕的方式:
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) 我有一个文本格式的大型数据文件,我想通过指定每个列长度将其转换为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) 我正在处理一个文件,其中字段由单个空格分隔.
awk将FS解释" "为"一个或多个空格",当其中一个字段为空时,它会误读我的文件.
我尝试使用"没有空格的空格"(" (?! )")作为FS,但是awk不支持负向前瞻.简单的谷歌查询,如"单一空间字段分隔符awk"只发送到手册页解释特殊处理FS=" ".我一定错过了相关的手册页......
如何使用单个空格作为awk字段分隔符?