标签: awk

使用 `awk` 打印唯一的单词、出现的总次数和总和

如何使用awk.

我正在使用awk

awk -F, '{sum[$1]+=$2} END{for (x in sum) print x, sum[x]}' inFile
Run Code Online (Sandbox Code Playgroud)

我可以修改上面的命令来打印唯一单词的总出现次数吗?类似于以下示例输入的以下结果:

结果(打印结果的顺序无关紧要):

A 2 25 
B 1 12 
C 3 18
Run Code Online (Sandbox Code Playgroud)

输入:

A,15
C,13
C,4
A,10
B,12
C,1
Run Code Online (Sandbox Code Playgroud)

我可以添加另一个数组来分别计算它们,但我认为应该有另一种方法来使用相同的数组来打印它。

数组中是否有任何索引sum来存储看到的总单词数?

command-line awk text-processing

4
推荐指数
1
解决办法
1714
查看次数

为什么此命令不能用作别名?

我一直在使用以下命令列出当前目录下任意深度的十个最大文件:

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
Run Code Online (Sandbox Code Playgroud)

(当列表太长时,我使用awk而不是head防止管道损坏错误

它运行良好,但显然很难每次都记住和输入。我试着把它放在 .bash_aliases 中,但它不工作(它打印 10 个空行)。

如果我使用less而不是awk,则输出会正确显示,但这意味着显示大于 10MB(我的较低阈值)的整个文件列表,按大小排序,而不仅仅是顶部的。

那么,是什么使awkchoke 成为别名命令的一部分(假设这确实是问题所在),我该怎么做才能解决它?

command-line bash alias awk

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

如何将一行的一部分复制到另一个位置

我在这样的文件中有大约 100 个打印语句:

printf("%f \n\n",row1.req_pnttime);
Run Code Online (Sandbox Code Playgroud)

我想复制字符串内的变量名,使其变成这样

printf("row1.req_pnttime: %f \n\n",row1.req_pnttime);
Run Code Online (Sandbox Code Playgroud)

谁能帮我做到这一点?

PS-每个打印语句的变量名称长度都不同,因此我需要一种通用方法来执行此操作。

sed awk

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

使用 awk 查找具有特定 2 行模式的文件

我有数百个具有这种模式的文件

@<TRIPOS>ATOM
  2 H18 65.2220 Du 1 RES1 0.0000
@<TRIPOS>BOND
 1  3  5  ar
@<TRIPOS>SUBSTRUCTURE
Run Code Online (Sandbox Code Playgroud)

其中,有些文件缺少 后的行@<TRIPOS>BOND,它们看起来像

@<TRIPOS>ATOM
  2 H18 65.2220 Du 1 RES1 0.0000
@<TRIPOS>BOND
@<TRIPOS>SUBSTRUCTURE
Run Code Online (Sandbox Code Playgroud)

我试图在我的工作目录中找到所有在 之后缺少数字行的文件,@<TRIPOS>BOND并将它们移动到另一个目录。我知道这是一项简单的任务,但我对 Linux 还是很陌生。

注意:文件的长度和行号各不相同,这就是我在@<TRIPOS>BOND字符串后面“grepping”行的原因。

这是我的代码之一,我计划在 for 循环中编写。它不起作用,但我展示它是为了展示我的试验之一。

cat file | grep -A1 '@<TRIPOS>BOND' | awk 'FNR == 2 {print}'
Run Code Online (Sandbox Code Playgroud)

谢谢

command-line bash find awk

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

使用 AWK 查找单词

有没有办法在整行中找到特定的记录?

这是我的文件:

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

如何搜索包含两行的所有行?

awk text-processing

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

bash比较两个不同长度的文件中的多列

我在文本文件中有以下数据集

数据.txt

d1,40,gold
d2,30,silver
d3,20,bronze
d4,10,iron
d5,5,wood
d6,20,gold
d7,10,wood
d8,5,gold
d9,10,silver
 .
 .
 .
Run Code Online (Sandbox Code Playgroud)

定义文件

gold,40
silver,30
bronze,20
iron,10
wood,5
Run Code Online (Sandbox Code Playgroud)

我需要的是将数据与我的定义文件进行比较,并在主文件中添加状态为“ok”或“nok”。由于数据文件很大,我可以用while循环找出来,但需要很长时间。有没有优化的方法?

数据.txt

d1,40,gold,ok
d2,30,silver,ok
d3,20,bronze,ok
d4,10,iron,ok
d5,5,wood,ok
d6,20,gold,nok
d7,10,wood,nok
d8,5,gold,nok
d9,10,silver,nok
Run Code Online (Sandbox Code Playgroud)

bash awk text-processing

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

如何通过增加数字部分来查找和替换字符串?

我的输入文件是,

ami21 ami65
ami67 ami66
ami88 ami76 ami29
ami55 
ami54
ami32
Run Code Online (Sandbox Code Playgroud)

使用单个命令行我需要输出,

ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56
ami55
ami33
Run Code Online (Sandbox Code Playgroud)

我使用了命令

awk -vRS=ami '{$0=$0+1;ORS=RT}++n' inputfile > outputfile
Run Code Online (Sandbox Code Playgroud)

但我得到了输出文件 ami21ami65ami67ami66ami88ami76ami29ami55ami54ami32

即所有字符串都写在同一行中并且没有空格。谁能建议我一些更好的命令行。

command-line sed awk

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

如何标记文本的出现?

我想转换

blue blue red green
Run Code Online (Sandbox Code Playgroud)

到:

color.1=blue color.2=blue color.3=red color.4=green
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何线索?sed、awk 等?

bash sed awk text-processing

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

如何在 CSV 中获取字符串,通过字符串名称创建一个新的 CSV 并将该特定行添加到其中?

这是我的 CSV 文件的示例:

04/Feb/2016:06:38:44-0500,ab,3,10,57,200,10254
04/Feb/2016:06:39:07-0500,cd,1,42,168,304,0
04/Feb/2016:06:39:07-0500,ef,1,43,169,304,0
04/Feb/2016:06:39:07-0500,ab,1,43,170,304,0
04/Feb/2016:06:39:07-0500,cd,1,44,171,304,0
04/Feb/2016:06:39:07-0500,ef,1,45,172,304,0
Run Code Online (Sandbox Code Playgroud)

我想在第二列中获取字符串,如果文件不存在则创建类似该字符串的文件,并在文件中添加该特定行。所以像这样:

fetch string in 2nd column -> "ab" -> if file doesnt exist create file called "ab.csv" -> open file and add line "04/Feb/2016:06:38:44-0500,ab,3,10,57,200,10254"
fetch string in 2nd column -> "cd" -> if file doesnt exist create file called "cd.csv" -> open file and add line "04/Feb/2016:06:39:07-0500,cd,1,42,168,304,0"
fetch string in 2nd column -> "ef" -> if file doesnt exist create file called "ef.csv" -> open file and add line "04/Feb/2016:06:39:07-0500,ef,1,43,169,304,0"
fetch …
Run Code Online (Sandbox Code Playgroud)

python command-line bash awk text-processing

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

获取特殊字符模式之间的行

下面是我的输入文件:

---
{
  "date":"2015-09-24",
  "title":"Getting Started with Git",
  "template":"post",
  "thumbnail":"content/thumbnails/test.jpeg",
  "slug":"getting-started-with-git",
  "categories":[ "cat1", "Focus", "Mustang" ],
  "tags":[ "Fiesta", "Focus", "Mustang" ]
}
---

#Hello

---
This is sample
---

```
var x=1;
entry.forEach(function(item){
    x=x++;
})
```
Run Code Online (Sandbox Code Playgroud)

我在输出中期望的是,2行之间的' --- '

{
  "date":"2015-09-24",
  "title":"Getting Started with Git",
  "template":"post",
  "thumbnail":"content/thumbnails/test.jpeg",
  "slug":"getting-started-with-git",
  "categories":[ "cat1", "Focus", "Mustang" ],
  "tags":[ "Fiesta", "Focus", "Mustang" ]
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现它?使用awk,只有当我将 ' --- '替换为诸如 'start'/'end' 之类的字符串时,我才能实现这一点。

awk '/start/{f=1;next} /end/{f=0;exit} f'  $FILE_PATH
Run Code Online (Sandbox Code Playgroud)

command-line awk text-processing

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

标签 统计

awk ×10

command-line ×6

text-processing ×6

bash ×5

sed ×3

alias ×1

find ×1

python ×1