Questions tagged «awk»

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

4
根据匹配字段对列总和
我有一个以下格式的大文件: 2 1019 0 12 2 1019 3 0 2 1021 0 2 2 1021 2 0 2 1022 4 5 2 1030 0 1 2 1030 5 0 2 1031 4 4 如果第2列中的值匹配,我想对两行的第3列和第4 列中的值求和,否则仅对唯一行中的值求和。 所以我希望的输出看起来像这样: 2 1019 15 2 1021 4 2 1022 9 2 1030 6 2 1031 …

2
重新索引大型CSV文件
我在这个有用的线程中仔细研究了答案,但是我的问题似乎相去甚远,以至于我无法想到一个好的答案(至少使用sed)。 我有一个很大的CSV文件(超过200 GB),其中的行如下所示: <alphanumerical_identifier>,<number> 在<alphanumerical_identifier>整个文件中唯一的位置。我想创建一个单独的文件,用索引替换第一列,即 <index>,<number> 这样我们得到: 1, <number> 2, <number> 3, <number> 可以awk在不将完整文件加载到内存的情况下生成递增索引吗? 由于索引单调增加,因此最好只删除索引。解决方案会有所不同吗,即: <number> <number> <number>
11 files  sed  awk  csv 

6
如何输出2个文件之间的差异?
我的文件包括以下内容;大致: username:username:username:username:username 上面的行继续到大约600个字符。 我使用awk命令是为了将其用作从命令行发送的API / HTTP请求中的参数。 我正在使用脚本获取“跟随”我的用户帐户列表,每隔24小时左右,将硬盘上的原始列表与新输出的用户名列表进行比较(并回显不再关注的用户)我。我将不得不使用bash ..测试每个用户名将我的逻辑封装到一个循环中。 我当前的脚本: user=$(awk -F: '{ print $1 }' FILE) # Grab $User to use as an argument. following=$(exec CURRENT_FOLLOWERS) # Outputs the new file echo "X amount of users are following you on 78B066B87AF16A412556458AC85EFEF66155" SAVE CURRENT FOLLOWERS TO NEW A FILE. if [[ …

3
一次替换多个字符串
我正在寻找一种使用通用Unix工具(bash,sed,awk或perl)用具体值替换模板文件中占位符字符串的方法。重要的是,一次更换即可完成更换,也就是说,对于另一次更换,不得考虑已经扫描/更换的物品。例如,这两次尝试均失败: echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA 在这种情况下,正确的结果当然是BA。 通常,该解决方案应等效于从左至右扫描输入,以与给定替换字符串之一进行最长匹​​配,并且对于每个匹配,执行替换并从输入中的该点继续进行操作(无已读取的输入,也不应考虑执行替换操作以进行匹配)。实际上,细节并不重要,只是替换的结果从不考虑全部或部分替换。 注意我只是在寻找正确的通用解决方案。请不要提出某些输入(输入文件,搜索和替换对)失败的解决方案,但是看起来不太可能。
11 bash  sed  awk  string  replace 

9
如何打印字符串中最长的数字?
我正在寻找一种打印字符串中最长数字的方法。 例如:如果我有字符串 212334123434test233 我该如何打印 212334123434 ? 注意:我正在寻找最长的连续数字序列,而不是数字更高的值。 编辑:谢谢大家的回答。对这个问题的反应非常热烈。我将@HaukeLaging的帖子标记为可接受的答案,因为它非常适合我的具体情况,但我想指出,所有答案都同样有效。有几种不同的选择解决一个问题总是很高兴。

3
首先使用awk处理最后一行
我有一个要awk基于最后一个数据点进行规范化的数据文件。因此,我想先访问最后一个数据点,以规范化数据,然后正常处理。 以下方法使用tac两次即可完成工作,但可能比必要的方法复杂。 $ cat file 0 5 1 2 2 3 3 4 $ tac file | awk 'NR==1{norm=$2} {print $1, $2/norm}' | tac 0 1.25 1 0.5 2 0.75 3 1 我的问题是:仅使用awk是否可以获得上述结果? 我认为答案是“不,awk逐行扫描文件”,但我愿意提出替代建议。

2
awk高精度算术
我正在寻找一种方法来告诉awk在替换操作中执行高精度算术。这涉及从文件中读取字段,并以该值的1%增量替换它。但是,我在那里失去了精度。这是问题的简化重现: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}' 0.546748 在这里,十进制精度后我有16位数字,但是awk仅给出6位数字。使用printf,我得到相同的结果: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}' 0.546748 关于如何获得所需精度的任何建议?

12
过滤文本文件以删除空行的好方法是什么?
我有一个.csv文件(在Mac上),有一堆空行,例如: "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4" "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum …

5
在保持顺序的同时删除相邻的重复行
我有一个带有一列的文件,每个文件的名称重复多次。我想将每个重复压缩为一个,同时保留与相同名称的其他重复不相邻的任何相同名称的重复。 例如,我想将左侧转向右侧: Golgb1 Golgb1 Golgb1 Akna Golgb1 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna Akna Spata20 Spata20 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna 这就是我一直在使用的perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt 方法:但是,此方法仅使左边代表一个(即,Golb1和Akna不再重复)。 有没有一种方法可以为每个块保留唯一的名称,同时保留在多个不相邻的块中重复的名称?
11 awk  sed  sort  uniq 

3
打印以特定字符串开头的列
我有一个看起来像这样的文件: ID101 G T freq=.5 nonetype ANC=.1 addinfor ID102 A T freq=.3 ANC=.01 addinfor ID102 A T freq=.01 type=1 ALT=0.022 ANC=.02 addinfor 如您所见,每行的列数略有不同。我特别想要第1、2、3、4列和以ANC= 所需的输出: ID101 G T freq=.5 ANC=.1 ID102 A T freq=.3 ANC=.01 ID102 A T freq=.01 ANC=.02 我通常使用aawk命令来解析文件: awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}' …

8
将文本文件拆分为固定单词数的行
相关但没有令人满意的答案:如何将大文本文件拆分为500个单词左右的块? 我试图将一个文本文件(http://mattmahoney.net/dc/text8.zip)一行都包含> 10 ^ 7个单词,然后将其拆分为N个单词的行。我当前的方法可行,但相当缓慢且难看(使用shell脚本): i=0 for word in $(sed -e 's/\s\+/\n/g' input.txt) do echo -n "${word} " > output.txt let "i=i+1" if [ "$i" -eq "1000" ] then echo > output.txt let "i=0" fi done 关于如何使它更快或更紧凑的任何提示?

3
可以将tr命令链接起来以避免流水线中有多个tr进程吗?
我有一堆txt文件,我想将它们输出为小写字母,只有字母和每行一个字,我可以tr在管道中使用多个命令来完成此操作,如下所示: tr -d '[:punct:]' <doyle_sherlock_holmes.txt | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' 可以一次扫描吗?我可以写一个C程序要做到这一点,但我觉得有一种方法使用去做tr,sed,awk或perl。
11 sed  awk  perl  tr 

5
如何使用Shell从MAC地址派生IPv6地址?
我们知道我们可以使用MAC地址来创建接口标识符,例如,对于本地链路的IPv6地址,该标识符在网络中应该是唯一的。 该图显示了执行此操作的方法: 我的问题是: 如何使用awk或从MAC创建IPv6地址sed? 或者是否有任何命令可以为我提供特定MAC的链接本地IPv6地址(类似createIPv6 myMAC)?
11 sed  awk  ipv6  mac-address 

2
连接具有匹配列的两个文件
File1.txt id No gi|371443199|gb|JH556661.1| 7907290 gi|371443198|gb|JH556662.1| 7573913 gi|371443197|gb|JH556663.1| 7384412 gi|371440577|gb|JH559283.1| 6931777 File2.txt id P R S gi|367088741|gb|AGAJ01056324.1| 5 5 0 gi|371443198|gb|JH556662.1| 2 2 0 gi|367090281|gb|AGAJ01054784.1| 4 4 0 gi|371440577|gb|JH559283.1| 21 19 2 output.txt id P R S NO gi|371443198|gb|JH556662.1| 2 2 0 7573913 gi|371440577|gb|JH559283.1| 21 19 2 6931777 File1.txt有两列,而File2.txt有四列。我想加入两个具有唯一ID的文件(array [1]应该在两个文件(file1.txt和file2.txt)中都匹配,并且只给输出匹配的ID(请参见output.txt)。 …
11 awk  join 

2
如何使用awk就地更改文件?(与“ sed -i”一样)
我有一个awk脚本new.awk: BEGIN { FS=OFS="," } NR==1 { for (i=1; i<=NF; i++) { f[$i] = i } } NR > 1 { begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"]))) endSecs = begSecs + $(f["TotalDuration"]) $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs) } { print } 我在shell中称呼它 awk new.awk sample.csv ...但是我可以在终端中看到更改。与使用时一样,如何在文件中进行更改sed -i?
11 linux  shell  awk 

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.