awk 相关问题

AWK是一种解释性编程语言,专为文本处理而设计,通常用作数据提取和报告工具。 AWK主要用于Unix系统。

将子串按给定比例与fasta格式的序列交换

我有两个非交错 fasta 格式的序列: >序列1 啊啊啊啊啊 >序列2 TTTTTTTTTT 我想按一定比例交换两个序列的部分。比例为0.5(...

回答 1 投票 0

寻找与 sed 替代等效的 awk gsub

我正在使用以下 sed 命令,我想将其传输到 awk 以将日期从 2023-12-15 更改为 15/12/2023: echo "c_az_6332,2023-12-15,-24.01,BP_Connect,详情,详情&qu...

回答 1 投票 0

awk 模式匹配

我要打印 用户ID = 1234 用户 ID = 12345 时间戳 = 88888888 js = abc 根据我的数据 乱七八糟sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 我要打印 userId = 1234 userid = 12345 timestamp = 88888888 js = abc 来自我的数据 messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss <input name="userId" value="1234" type="hidden"> messsssssssssssssssssss <input name="userid" value="12345" type="hidden"> messssssssssssssssssss <input name="timestamp" value="88888888" type="hidden"> messssssssssssss <input name="js" value="abc" type="hidden"> messssssssssssssssssssssssss messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 我如何使用 AWK(或其他)来做到这一点?假设我的数据存储在“$info”变量中(单行数据)。 编辑:单行数据我的意思是所有数据都像这样表示 messss...<input name="userId" value="1234" type="hidden">messsss...<input ....>messssssss 所以我不能使用 grep 来提取兴趣部分。 我不确定我是否理解您的“单行数据”评论,但如果这是在文件中,您可以执行以下操作: cat file | grep '^<input ' | sed 's/^<input name="//' | sed 's/" value="/ = /' | sed 's/".*$//' 这是剪切粘贴版本: cat file | grep '^<input ' | sed 's/^<input name="//' | sed 's/" value="/ = /' | sed 's/".*$//' 这变成: messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss <input name="userId" value="1234" type="hidden"> messsssssssssssssssssss <input name="userid" value="12345" type="hidden"> messssssssssssssssssss <input name="timestamp" value="88888888" type="hidden"> messssssssssssss <input name="js" value="abc" type="hidden"> messssssssssssssssssssssssss messssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 非常高兴地进入: userId = 1234 userid = 12345 timestamp = 88888888 js = abc grep只是提取您想要的行,而sed分别命令: 删除第一个报价。 用“=”替换名称和值之间的部分。 删除收盘价后面的所有内容(包括该报价)。 这部分可能应该是对帕克斯答案的评论,但对于那个小盒子来说有点长。我在想“单行数据”意味着你的变量中根本没有任何换行符?然后这就会起作用: echo "$info" | sed -n -r '/<input/s/<input +name="([^"]+)" +value="([^"]+)"[^>]*>[^<]*/\1 = \2\n/gp' 有趣的注释: - -n 表示默认情况下不打印 - 我们会在最后说明何时打印 p。 -r 表示扩展正则表达式 /<input/ 在开始时确保我们甚至不必费心去处理不包含所需模式的行 最后的 \n 是为了确保所有记录最终都在单独的行上 - 任何原始换行符仍然会在那里,而摆脱它们的最快方法是添加 '|格列普。'最后 - 你可以使用一些 sed 魔法,但在输入后三十秒你将无法理解它。 我可以想办法在 awk 中做到这一点,但这确实是 sed (或 perl!)的工作。 要处理包含多行的变量,需要将变量名放在双引号中: echo "$info"|sed 's/^\(<input\( \)name\(=\)"\([^"]*\)" value="\([^"]*\)"\)\?.*/\4\2\3\2\5/' 使用perl cat file | perl -ne 'print($1 . "=" . $2 . "\n") if(/name="(.*?)".*value="(.*?)"/);' IMO,解析 HTML 应该使用适当的 HTML/XML 解析器来完成。例如,Ruby 有一个优秀的包 Nokogiri,用于解析 HTML/XML: ruby -e ' require "rubygems" require "nokogiri" doc = Nokogiri::HTML.parse(ARGF.read) doc.search("//input").each do |node| atts = node.attributes puts "%s = %s" % [atts["name"], atts["value"]] end ' mess.html 产生您想要的输出 AWK: BEGIN { # Use record separator "<", instead of "\n". RS = "<" first = 1 } # Skip the first record, as that begins before the first tag first { first = 0 next } /^input[^>]*>/ { #/ # make sure we don't match outside of the tag end = match($0,/>/) # locate the name attribute pos = match($0,/name="[^"]*"/) if (pos == 0 || pos > end) { next } name = substr($0,RSTART+6,RLENGTH-7) # locate the value attribute pos = match($0,/value="[^"]*"/) if (pos == 0 || pos > end) { next } value = substr($0,RSTART+7,RLENGTH-8) # print out the result print name " = " value } awk 和 sed 等工具可以与 XMLStarlet 和 HTML Tidy 一起使用来解析 HTML。 这是一个简短的单行: awk 'BEGIN{ FS="\""; RS="<";}{print $2," = ", $4;}' '/home/sass22/t.f.2.txt' <(printf "%s" ${info}) 说明: RS=“<" -- break the text into records (-lines) FS=""" -- break records into fields”

回答 8 投票 0

用awk实现tail

我正在努力处理这个应该模拟 tail 命令的 awk 代码 数字=$1; { 向量[NR]=$0; } 结尾{ for(i=NR-num;i<=NR;i++) print vect[$i] } So what I'm trying to ac...

回答 5 投票 0

Awk 使用 [ 和 ] 作为分隔符(第 2 章),Windows

我知道以前已经有人问过这个问题,但我未能使这些示例发挥作用。 在 Windows 下,给定日志文件中的以下输入: [140219UTC10:12:03.338] [inf] [ 403] [ServiceManager] 成功初始化

awk
回答 1 投票 0

打印procmail中的变量

我有一个 Procmail 配方来过滤传入的邮件,如下所示: :0 *^主题:.*(测试) *? egrep -is -f /root/Procmail/whitelist.txt { :0 前线 |格式-I“” :...

回答 1 投票 0

如何在awk中访问字典中一个键的多个值?

所以我在 awk/bash 中编写代码。我有两个文件,第一个文件的格式如下: chr1_2376428_A_T chr1_5465765_T_A chr1_8958392_C_G .... chrM_237426_C_G 该文件涵盖所有铬...

回答 1 投票 0

awk 部分字符串匹配(如果列/单词部分匹配)

我的虚拟文件如下所示: C1 C2 C3 1 一场雪 2B雪人 雪C 索曼 如果有 3 美元的串雪,我想排队。我可以这样做: awk...

awk
回答 6 投票 0

使用 grep 或其他工具搜索大型 CSV 文件

我有一个 4 gig CSV,我正在尝试搜索以获取 CSV 的子集。我有一个 csv 文件,其中包含我正在搜索的关键字(这些关键字将位于大 csv 的第一列中)...

回答 1 投票 0

如何指示 awk 保持浮点数不变,但将 .0 附加到整数?

我有一个 csv 文件,除了第一列之外,还包含浮点数和整数(没有科学记数法)。我想输出另一个具有相同内容的 csv 文件,但其中所有 num...

回答 1 投票 0

高效/安全的shell脚本从分隔的分割字符串中删除所有子字符串匹配?

对于由分隔符“:”分割的字符串,匹配分隔符之间包含不同字符串“XXX”的所有子字符串的最佳方式是什么。 例如,首先 /aa...

回答 3 投票 0

使用 Linux 命令行提取单词

我有一个语料库文件,我需要将其与另一个文件“垂直”进行比较并列出唯一的剩余字符串。例如: 排除.txt: 编辑 s 英 第二个文件是: 语料库.txt: 工作过

回答 1 投票 0

Awk 文件脚本解析 2 种不同的输入格式(每次一个)

我尝试准备一个常见的 awk 脚本文件来解析输入文件。 输入文件有两种不同的格式。 (输入1.txt 和输入2.txt)。它将是其中之一(不是两者都在同一个文件中)。 awk -f

回答 1 投票 0

使用 awk 将坐标 d-m-s 转换为十进制

我的输入是一个制表符分隔的文本文件,其纬度和长度以 D-M-S 格式表示。 我要求输出以十进制为单位 我有 php 代码,但是计算速度非常慢。 使用 awk 可以更快地完成此操作吗? ...

回答 4 投票 0

搜索匹配项,然后根据匹配项打印字符

我尝试使用下面的代码在匹配之前打印第 8 个字符以及第 18 到 8 个字符。 该代码适用于某些行,但不适用于其他一些行。 例如,在电子...

awk
回答 2 投票 0

尝试从 UNIX 文件中删除不可打印的字符(垃圾值)

我正在尝试从文件中的记录中删除不可打印的字符(例如 ^@)。由于文件中的记录量太大,因此使用 cat 不是一个选项,因为循环占用了太多时间...

回答 4 投票 0

如何从 shell 中的文本文件中选取随机唯一行?

我有一个行数未知的文本文件。我需要随机抓取其中一些行,但我不希望有任何重复的风险。 我试过这个: 点-r 3 1 `wc -l 我有一个行数未知的文本文件。我需要随机抓取其中一些行,但我不希望有任何重复的风险。 我试过这个: jot -r 3 1 `wc -l<input.txt` | while read n; do awk -v n=$n 'NR==n' input.txt done 但这很丑陋,并且不能防止重复。 我也尝试过这个: awk -vmax=3 'rand() > 0.5 {print;count++} count>max {exit}' input.txt 但这显然也不是正确的方法,因为我什至不能保证得到 max 线。 我被困住了。我该怎么做? 这可能对你有用: shuf -n3 file shuf 是 GNU coreutils 之一。 如果您可以使用 Python(将 10 更改为您想要的): python -c 'import random, sys; print("".join(random.sample(sys.stdin.readlines(), 10)).rstrip("\n"))' < input.txt (这适用于 Python 2.x 和 3.x。) 另外,(再次将 10 更改为适当的值): sort -R input.txt | head -10 如果您的系统上有 jot,那么我猜您正在运行 FreeBSD 或 OSX 而不是 Linux,因此您可能没有 rl 或 sort -R 等可用工具。 不用担心。不久前我不得不这样做。试试这个: $ printf 'one\ntwo\nthree\nfour\nfive\n' > input.txt $ cat rndlines #!/bin/sh # default to 3 lines of output lines="${1:-3}" # default to "input.txt" as input file input="${2:-input.txt}" # First, put a random number at the beginning of each line. while read line; do printf '%8d%s\n' $(jot -r 1 1 99999999) "$line" done < "$input" | sort -n | # Next, sort by the random number. sed 's/^.\{8\}//' | # Last, remove the number from the start of each line. head -n "$lines" # Show our output $ ./rndlines input.txt two one five $ ./rndlines input.txt four two three $ 这是一个 1 行示例,还使用 awk 更干净地插入随机数: $ printf 'one\ntwo\nthree\nfour\nfive\n' | awk 'BEGIN{srand()} {printf("%8d%s\n", rand()*10000000, $0)}' | sort -n | head -n 3 | cut -c9- 请注意,不同版本的 sed(在 FreeBSD 和 OSX 中)可能需要 -E 选项而不是 -r 来处理正则表达式中的 ERE 或 BRE 方言,如果你想明确地使用它,尽管我的一切我们已经在 BRE 中测试了转义边界的工作情况。 (旧版本的 sed(HP/UX 等)可能不支持此表示法,但只有当您已经知道如何执行此操作时,您才会使用这些表示法。) 这应该可以解决问题,至少使用 bash 并假设您的环境有其他可用命令: cat chk.c | while read x; do echo $RANDOM:$x done | sort -t: -k1 -n | tail -10 | sed 's/^[0-9]*://' 它基本上输出你的文件,在每行的开头放置一个随机数。 然后它对该数字进行排序,抓取最后 10 行,并从中删除该数字。 因此,它会从文件中为您提供十个随机行,没有重复。 例如,这是使用该 chk.c 文件运行 3 次的记录: ==== pax$ testprog chk.c } else { } newNode->next = NULL; colm++; ==== pax$ testprog chk.c } arg++; printf (" [%s] n", currNode->value); free (tempNode->value); ==== pax$ testprog chk.c char tagBuff[101]; } return ERR_OTHER; #define ERR_MEM 1 === pax$ _ sort -Ru filename | head -5 将确保没有重复。并非所有 sort 的实现都有 -R 选项。 要使用 Perl 从 N 获取 FILE 随机行: perl -MList::Util=shuffle -e 'print shuffle <>' FILE | head -N 如果您不想安装其他任何东西,这里有一个使用 ruby 的答案: cat filename | ruby -e 'puts ARGF.read.split("\n").uniq.shuffle.join("\n")' 例如,给定一个如下所示的文件 (dups.txt): 1 2 1 3 2 1 2 3 4 1 3 5 6 6 7 您可能会得到以下输出(或一些排列): cat dups.txt| ruby -e 'puts ARGF.read.split("\n").uniq.shuffle.join("\n")' 4 6 5 1 2 2 3 7 1 3 评论中的进一步示例: printf 'test\ntest1\ntest2\n' | ruby -e 'puts ARGF.read.split("\n").uniq.shuffle.join("\n")' test1 test test2 当然,如果您的文件包含重复的测试行,您只会得到一行: printf 'test\ntest\ntest\n' | ruby -e 'puts ARGF.read.split("\n").uniq.shuffle.join("\n")' test 虽然我很欣赏 OP 在 FreeBSD 上的表现,并且我不确定这是否适用于他们的系统,但是 PowerShell 可能是一个有用且干净的替代方案? Get-Content "path/to/file" | Get-Random PowerShell 默认在 Windows 上可用,但也可安装在 Linux 和 macOS 上

回答 8 投票 0

在其他值相等的行中查找一列的最大值

也许有些人可以帮助我为以下内容提供一个独特的 awk 脚本。我有以下输入,其中第二个字段表示以像素为单位的尺寸(w,h)和位置(x,y),例如:892x584+1002+922。

awk
回答 1 投票 0

如何只打印满足多个条件的行?

也许有些人可以帮助我为以下内容提供一个独特的 awk 脚本。我有以下输入,其中第二个字段表示以像素为单位的尺寸(w,h)和位置(x,y),例如:892x584+1002+922。

awk
回答 1 投票 0

简单的awk命令问题(FS、OFS相关)

我尝试重新组织包含以下内容的文件的格式: >人类|chr16:86430087-86430726 |元素 1 |积极的 >人类|chr16:85620095-85621736 |元素 2 |消极的 >人类|chr16:80423343-

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.