嗨,请帮我找到数字。我的文件只有一行数据如下:
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
但是在一个命令行中查看。
答案 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
代替Brand
和53A
代替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