Shell脚本 - 如何从行中提取

时间:2017-08-28 07:20:46

标签: shell unix awk

嗨,请帮我找到数字。我的文件只有一行数据如下:

53-Brand|5556-Color Family|10984-Fit|10313-Combo

寻找输出 53,5556,10984,10313

由于

我试过

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

但是在一个命令行中查看。

9 个答案:

答案 0 :(得分:3)

grep -oP "\d+" filename

输出:

53
5556
10984
10313

简要说明:

-P:告诉它是perl regexp
\d+:仅匹配数字
-o:捕获匹配的数字

答案 1 :(得分:2)

两种方法:

- 使用 grep

grep -o '[[:digit:]]\+' file

- 使用 gawk

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

输出(两种方法):

53
5556
10984
10313

答案 2 :(得分:1)

考虑您的Input_file与显示的示例相同。然后尝试关注awk一次。

awk  -F'[-|]' '{for(i=1;i<=NF;i++){if(i%2!=0){val=val?val "," $i:$i}};print val;val=""}'  Input_file

说明:制作 - 和|作为字段分隔符,然后逐个遍历所有字段并检查是否有任何字段位于ODD位置,然后将其值连接到名为val的变量,并在循环外打印它的值并使其无效。

编辑:如果Input_file与显示的示例相同,则再添加一个解决方案。

awk '{gsub(/-[a-zA-Z]+\||-[a-zA-Z]+ [a-zA-Z]+\|/,",");sub(/-[a-zA-Z]+$/,"");print}'  Input_file

答案 3 :(得分:1)

在当前行上默认使用gensub()运行,很可能是 最优雅的解决方案:

awk '{ print gensub(/-[^|]+\|?/, " ", "g"); }' tmp.txt

正则表达式/-[^|]+\|/匹配以-开头的任何内容 直到可选的|(没有出现在行尾)。

答案 4 :(得分:1)

假设您的单行数据文件为input.txt,您基本上可以实现您想要的目标

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

第一个tr产生空格,第二个产生逗号。

但是你需要知道最后输出没有\ n。根据您对结果的处理方式,这可能会或可能不会是您想要的。如果尾随换行符是importand,则可以执行

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

或性能较低的

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

答案 5 :(得分:1)

echo "53-Brand|5556-Color Family|10984-Fit|10313-Combo"|awk -F'[-|]' '{print $1","$3","$5","$7}'

53,5556,10984,10313

答案 6 :(得分:1)

$ awk -F'[-|]' '{for (i=1;i<=NF;i+=2) print $i}' file
53
5556
10984
10313

如果/当一个数字出现在您不想要打印的文本中时,或者当您希望打印的文本中出现非数字时,您获得的大多数答案将会失败,以上获胜&# 39;吨。例如,使用Brand7代替Brand53A代替53

$ 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

答案 7 :(得分:1)

查看您的输入数据我看到它被两个分隔符很好地分块...首先是管道char |然后通过char - ... 这个初步的第一步将字符串拆分为分隔符&#39; |&#39;

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

并且对于完整的解决方案,这将分割每个子字符串,这些子字符串现在由分隔符&#39; - &#39;

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

答案 8 :(得分:0)

Sed是你的朋友:

echo $VALUE | sed -e 's/[^(0-9|)]//g' | sed -e 's/|/, /g'

其中VALUE变量包含您的输入字符串。

输入53-Brand|5556-Color Family|10984-Fit|10313-Combo

输出53, 5556, 10984, 10313