Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Shell脚本-如何从行中提取_Shell_Unix_Awk - Fatal编程技术网

Shell脚本-如何从行中提取

Shell脚本-如何从行中提取,shell,unix,awk,Shell,Unix,Awk,嗨,请帮我找到唯一的号码。我的文件只有一行数据,如下所示: 53-Brand|5556-Color Family|10984-Fit|10313-Combo 寻找产出 5355561098410313 谢谢 我试过了 awk -F',' '{print $2}' /cat_formula > 1 53-Brand|5556-Color Family|10984-Fit|10313-Combo awk -F'|' '{print $1}{print $2}{prin

嗨,请帮我找到唯一的号码。我的文件只有一行数据,如下所示:

53-Brand|5556-Color Family|10984-Fit|10313-Combo
寻找产出 5355561098410313

谢谢


我试过了

awk -F',' '{print $2}' /cat_formula       > 1
    53-Brand|5556-Color Family|10984-Fit|10313-Combo

awk -F'|' '{print $1}{print $2}{print $3}{print $4}' 1 >2
    53-Brand
5556-Color Family
10984-Fit
10313-Combo


awk -F'-' '{print $1}' 2
    53
5556
10984
10313

但查看一个命令行。

考虑到您的输入文件与所示示例相同。然后试着跟随awk一次

awk  -F'[-|]' '{for(i=1;i<=NF;i++){if(i%2!=0){val=val?val "," $i:$i}};print val;val=""}'  Input_file
grep-oP“\d+”文件名

输出:

53
5556
10984
10313
简要说明:

-p
:告诉它是一个perl regexp
\d+
:只匹配数字
-o
:要捕获刚刚匹配的数字

有两种方法:

53
5556
10984
10313
--使用grep

grep -o '[[:digit:]]\+' file
awk -v FPAT='[0-9]+' '{ for(i=1;i<=NF;i++) print $i }' file

--用目瞪口呆

grep -o '[[:digit:]]\+' file
awk -v FPAT='[0-9]+' '{ for(i=1;i<=NF;i++) print $i }' file
使用默认情况下在当前行上运行的
gensub()
,很可能是 最优雅的解决方案:

awk '{ print gensub(/-[^|]+\|?/, " ", "g"); }' tmp.txt
正则表达式
/-[^ |]+\\\\//
匹配以
-
开头的任何内容 直到可选的
|
(不显示在行尾)

Sed是你的朋友:

echo $VALUE | sed -e 's/[^(0-9|)]//g' | sed -e 's/|/, /g'
其中
VALUE
变量包含输入字符串

输入
53品牌| 5556颜色系列| 10984合身| 10313组合


输出
5355561098410313

假设您的单行数据文件是
input.txt
,您基本上可以通过

tr -cs  '|0-9' ' ' <input.txt | tr  '|' ,
或者是性能较差的

tr -cs  '|0-9' ' ' <input.txt | tr  '|' , | xargs

tr-cs'| 0-9''”查看您的输入数据,我发现它被两个分隔符很好地分块。。。首先是管道字符|,然后是字符-。。。
这是初步的第一步,在分隔符“|”上拆分字符串

echo "53-Brand|5556-Color Family|10984-Fit|10313-Combo" |  xargs -d'|' -i  echo {}
53-Brand
5556-Color Family
10984-Fit
10313-Combo
对于完整的解决方案,这将通过分隔符“-”拆分现在位于其自身行上的每个子字符串

echo "53-Brand|5556-Color Family|10984-Fit|10313-Combo"|xargs -d'|' -i  echo {}|cut -d '-' -f1
53
5556
10984
10313

对于新手来说,这是不必要的使用cat(或者简单地说是UOOC)。伙计们,谢谢。但我的动机是在这里使用管道,并将grep逻辑与输入源分开,以便足够清楚地表明,如果它们正在从其他进程(比如说
tail
)读取数据,那么grep只需要像这样管道传输。毫无疑问,同样的文件名可以写成
grep-oP“\d+”文件名
。是的,UUOc有点开玩笑,请注意它没有丁字。但它确实大声讲述了你的思维过程。因此,任何时候你发现自己在做
catfoo
,而你没有将foo与其他东西连接起来,那么你可能正在提交一个UUOc
:)
@DavidC.Rankin:我已经按照建议进行了编辑。如果在最初的问题中提到输入文件的大小为GBs,那么我会在第一步直接将文件输入到grep,以避免不必要的CPU和内存使用。如果文件包含类似于
|非数字组合
的模式,这将失败。此外,使用奇数位置逻辑对该任务来说是一种过度使用,并将导致不必要的开销。当UNIX为我们提供了字符类、正则表达式等超级功能时,为什么会出现这种逻辑?在相同的基础上添加了一个使用替代功能的解决方案。输入
53 Brand | 5556 Color Family | 10984 Fit | 10313 Combo | meow bhow
再次失败。输出为
5355561098410313,喵喵
。我建议您按照我上一条评论中的建议捕获数字。好的,我将尝试使其更通用。但我想我已经给出了一个合理的警告,若输入文件和所示的示例相同,那个么这是我唯一在意的。我唯一担心的是,因为只需要提取数字,所以所有这些都不是必需的,可以直接完成,而不需要任何额外的开销。你能添加一个描述吗?@ExDev这就像要求写
i++
的人添加一个注释来描述它的作用。并非所有的答案都需要描述。@EdMorton:我不知道这一点,你可能是对的,但是,如果它是如此琐碎,我可以认为OP需要一个解释,否则我想他会自己回答的,一点也不。不能想出准确的语法来做一些琐碎的事情并不意味着在向您展示琐碎的代码时您无法理解它。如果你不能理解一些琐碎的代码,那么学习如何在手册页中查找一些基本的构造比用勺子喂你要好得多。当工具由于缺少文本而将答案标记为可能的低质量时,由审阅者来决定答案是否低质量,不要仅仅假设工具是正确的-如果工具总是正确的,它不会仅仅为一个人的审阅升起一个标记。你应该提一下,这只是由于
gensub()而引起的
@EdMorton同意。
$ echo '53A-Brand7|5556-Color Family|10984-Fit|10313-Combo' | awk -F'[-|]' '{for (i=1;i<=NF;i+=2) print $i}'
53A
5556
10984
10313
echo "53-Brand|5556-Color Family|10984-Fit|10313-Combo" |  xargs -d'|' -i  echo {}
53-Brand
5556-Color Family
10984-Fit
10313-Combo
echo "53-Brand|5556-Color Family|10984-Fit|10313-Combo"|xargs -d'|' -i  echo {}|cut -d '-' -f1
53
5556
10984
10313