Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何从带有awk或sed的行中提取单个报价中的数字?_Regex_Bash_Sed_Awk - Fatal编程技术网

Regex 如何从带有awk或sed的行中提取单个报价中的数字?

Regex 如何从带有awk或sed的行中提取单个报价中的数字?,regex,bash,sed,awk,Regex,Bash,Sed,Awk,我有一行,用制表符分隔: chr1 11460 11462 '16/38' 421 + chr1 11460 11462 '21/29' 724 + 2 chr1 11479 11481 '11/29' 379 + chr1 11479 11481 '20/5' 667 + 2 我想做的是测试“”中的第二个数字是否都大于或等于10。如果是,我将输出这一行。所以

我有一行,用制表符分隔:

chr1    11460   11462   '16/38' 421     +       chr1    11460   11462   '21/29' 724     +       2
chr1    11479   11481   '11/29' 379     +       chr1    11479   11481   '20/5' 667     +       2
我想做的是测试“”中的第二个数字是否都大于或等于10。如果是,我将输出这一行。所以结果应该是打印第一行

chr1    11460   11462   '16/38' 421     +       chr1    11460   11462   '21/29' 724     +       2
我可以编写一个perl代码来完成它。但这似乎是awk可以轻松做到的。。有人有办法吗


谢谢

获取单引号内内容的最简单方法可能是从每行的两端剥离所有内容,直到并包括单引号:

$ sed "s/^[^']*'//;s/'.*//" file
16/38
11/29
此sed表达式由两个命令组成:

  • s/^[^']*'/
    ——删除第一个单引号中的所有文本
  • s/'.*/
    ——从第一个(剩余)单引号到EOL的所有文本都被删除
要将其包装到使用该数据执行某些操作的shell脚本中,需要。。嗯,一个shell脚本

您可以使用bash的
read
命令解析这些内容。例如:

#!/bin/bash
IFS=/
sed "s/^[^']*'//;s/'.*//" file \
| while read left right; do
  echo "$left / $right"
done
要实现捕获多个单引号的内容,可以适当地扩展sed脚本,并根据需要的条件实现
if
语句。例如,获取两个单引号字符串的sed表达式可能是:

sed "s/^[^']*'\([^']*\)'[^']*'\([^']*\)'.*/\1 \2/"
这是一个大型正则表达式,它使用两组括号(和
\)
,来标记将放置在输出中的模式,
\1
\2

但是,您最好根据列位置分析内容:

$ while read _ _ _ A _ _ _ _ _ B _; do echo "$A .. $B"; done < file
'16/38' .. '21/29'
'11/29' .. '20/5'
$whileread\uuuuua\uuub;做回显“$A..$B”;完成<文件
'16/38' .. '21/29'
'11/29' .. '20/5'

实际上,实现编程逻辑是留给读者的一个练习。如果您希望我们帮助您编写脚本,请将您目前的工作包括在内。

获取单引号内内容的最简单方法可能是从每行的两端剥离所有内容,直到并包括单引号:

$ sed "s/^[^']*'//;s/'.*//" file
16/38
11/29
此sed表达式由两个命令组成:

  • s/^[^']*'/
    ——删除第一个单引号中的所有文本
  • s/'.*/
    ——从第一个(剩余)单引号到EOL的所有文本都被删除
要将其包装到使用该数据执行某些操作的shell脚本中,需要。。嗯,一个shell脚本

您可以使用bash的
read
命令解析这些内容。例如:

#!/bin/bash
IFS=/
sed "s/^[^']*'//;s/'.*//" file \
| while read left right; do
  echo "$left / $right"
done
要实现捕获多个单引号的内容,可以适当地扩展sed脚本,并根据需要的条件实现
if
语句。例如,获取两个单引号字符串的sed表达式可能是:

sed "s/^[^']*'\([^']*\)'[^']*'\([^']*\)'.*/\1 \2/"
这是一个大型正则表达式,它使用两组括号(和
\)
,来标记将放置在输出中的模式,
\1
\2

但是,您最好根据列位置分析内容:

$ while read _ _ _ A _ _ _ _ _ B _; do echo "$A .. $B"; done < file
'16/38' .. '21/29'
'11/29' .. '20/5'
$whileread\uuuuua\uuub;做回显“$A..$B”;完成<文件
'16/38' .. '21/29'
'11/29' .. '20/5'

实际上,实现编程逻辑是留给读者的一个练习。如果您想让我们帮助您编写脚本,请包括您迄今为止的工作。

如果您设置了正确的字段分隔符,这非常简单:

awk -F "['/]" '{for (i=3; i<=NF; i+=3) if ($i<10) next; print}' file

awk-F“['/]”{for(i=3;i如果设置了正确的字段分隔符,则非常容易:

awk -F "['/]" '{for (i=3; i<=NF; i+=3) if ($i<10) next; print}' file

awk-F“['/]”{for(i=3;i只要这些是字符串中唯一的”字符,并且数字没有前导零,就可以使用正则表达式:

\d\d+'.*\d\d+'
如果这两个先决条件中的任何一个都不成立,那么可以做出一些改变,但这取决于具体情况

您应该能够使用grep来获得使用该正则表达式所需的行。 以下仅将第一行放入stdout:

grep \d\d+'.*\d\d+' "chr1    11460   11462   '16/38' 421     +       chr1    11460   11462   '21/29' 724     +       2
chr1    11479   11481   '11/29' 379     +       chr1    11479   11481   '20/5' 667     +       2"

只要这些是字符串中唯一的“字符”,并且数字没有前导零,就可以使用正则表达式:

\d\d+'.*\d\d+'
如果这两个先决条件中的任何一个都不成立,那么可以做出一些改变,但这取决于具体情况

您应该能够使用grep来获得使用该正则表达式所需的行。 以下仅将第一行放入stdout:

grep \d\d+'.*\d\d+' "chr1    11460   11462   '16/38' 421     +       chr1    11460   11462   '21/29' 724     +       2
chr1    11479   11481   '11/29' 379     +       chr1    11479   11481   '20/5' 667     +       2"

我的版本,严重过量,但每行应使用任意数量的“xx/xx”:

awk -F'\t' "{
    found=1;
    for(i=0;i<NF;i++){
        if(match(\$i, /'[[:digit:]]+\/([[:digit:]]+)'/, capts)){
            if(capts[1] < 10){
                found=0;
                break;
            }
        }
    }
    if(found){
        print;
    }
}" file.txt
awk-F'\t''{
发现=1;

对于(i=0;i我的版本,严重过度杀戮,但每行应使用任意数量的“xx/xx”:

awk -F'\t' "{
    found=1;
    for(i=0;i<NF;i++){
        if(match(\$i, /'[[:digit:]]+\/([[:digit:]]+)'/, capts)){
            if(capts[1] < 10){
                found=0;
                break;
            }
        }
    }
    if(found){
        print;
    }
}" file.txt
awk-F'\t''{
发现=1;

对于(i=0;i当你说“第二个数字在“”内时”,第一行是21/29,第二行是20/5吗?实际上有两个单引号,我指的是每个单引号中的第二个数字,所以第一行是38和29,第二行是29和5。所以,你希望只有当所有第二个数字>=10或者其中任何一个都是10时,这行才匹配吗?当你说的时候,它们都是>=10“里面的第二个数字”",第一行是21/29,第二行是20/5吗?实际上有两个单引号,我指的是每个单引号中的第二个数字,所以对于第一行,38和29,第二行,29和5,那么你希望只有当所有第二个数字>=10或其中任何一个都是时,这一行才匹配吗?所有这些数字都是>=10每行有两对引号。这一行有点难理解。好的,我现在看到了你的完整答案。它相当复杂:)我会尝试编写脚本,谢谢。实际上每行有两对引号。这一行有点难理解。好的,我现在看到了你的完整答案。它相当复杂:)我会试着写剧本的,谢谢。