2012-01-03 59 views
58

比方说,我有以下字符串:击转弯多行字符串转换成一个逗号分隔

something1: +12.0 (some unnecessary trailing data (this must go)) 
something2: +15.5 (some more unnecessary trailing data) 
something4: +9.0 (some other unnecessary data) 
something1: +13.5 (blah blah blah) 

我如何把它转换成简单

+12.0,+15.5,+9.0,+13.5 

在bash?

+1

[Unix命令行中的简明和便携式“加入”的可能重复](http://stackoverflow.com/questions/8522851/concise-and-portable-join-on-the-unix-command -line) – 2015-04-01 23:29:30

回答

57

您可以使用awksed

awk -vORS=, '{ print $2 }' file.txt | sed 's/,$/\n/' 

或者,如果你想使用管道:

echo "data" | awk -vORS=, '{ print $2 }' | sed 's/,$/\n/' 

进行分解:

  • awk在细分领域
  • -vORS=,设置了“输出记录分隔符”来,,这是你想要的
  • 什么{ print $2 }告诉awk打印第二场对每条记录处理的数据是大(线)
  • file.txt是你的文件名
  • sed刚刚摆脱尾随,,并把它变成一个换行符(如果你想换行不,你可以做s/,$//
+0

awk:无效-v选项:( – Gevorg 2015-06-15 17:38:22

+3

在-v和ORS =之间加一个空格,(对我来说,在osx上) – 2015-06-25 20:33:32

+0

如何使管道分离的命令相同?awk -v ORS = |'{print $ 1 }'DCMC.rtf | sed's /,$/\ n /''出现错误 – Techiee 2017-10-04 15:41:19

8
$ awk -v ORS=, '{print $2}' data.txt | sed 's/,$//' 
+12.0,+15.5,+9.0,+13.5 

$ cat data.txt | tr -s ' ' | cut -d ' ' -f 2 | tr '\n' ',' | sed 's/,$//' 
+12.0,+15.5,+9.0,+13.5 
+0

欢呼声,如果awk的输入是通过标准输入(只要将'function | awk ...'在你的例子中? – 2012-01-03 15:21:10

+0

是的,我认为是。 – kev 2012-01-03 15:22:14

0

用Perl:

[email protected] ~ $ perl -ne 'push @l, (split(/\s+/))[1]; END { print join(",", @l) . "\n" }' <<EOF 
something1: +12.0 (some unnecessary trailing data (this must go)) 
something2: +15.5 (some more unnecessary trailing data) 
something4: +9.0 (some other unnecessary data) 
something1: +13.5 (blah blah blah) 
EOF 

+12.0,+15.5,+9.0,+13.5 
0

你也可以用两个SED调用做到这一点:

$ cat file.txt 
something1: +12.0 (some unnecessary trailing data (this must go)) 
something2: +15.5 (some more unnecessary trailing data) 
something4: +9.0 (some other unnecessary data) 
something1: +13.5 (blah blah blah) 
$ sed 's/^[^:]*: *\([+0-9.]\+\) .*/\1/' file.txt | sed -e :a -e '$!N; s/\n/,/; ta' 
+12.0,+15.5,+9.0,+13.5 

首先SED调用删除无趣的数据,以及第二个连接所有线路。

7

这应该工作太

awk '{print $2}' file | sed ':a;{N;s/\n/,/};ba' 
4

这可能会为你工作:

cut -d' ' -f5 file | paste -d',' -s 
+12.0,+15.5,+9.0,+13.5 

sed '/^.*\(+[^ ]*\).*/{s//\1/;H};${x;s/\n/,/g;s/.//p};d' file 
+12.0,+15.5,+9.0,+13.5 
0

您还可以打印这样的:

只是awk的:使用的printf

bash-3.2$ cat sample.log 
something1: +12.0 (some unnecessary trailing data (this must go)) 
something2: +15.5 (some more unnecessary trailing data) 
something4: +9.0 (some other unnecessary data) 
something1: +13.5 (blah blah blah) 

bash-3.2$ awk ' { if($2 != "") { if(NR==1) { printf $2 } else { printf "," $2 } } }' sample.log 
+12.0,+15.5,+9.0,+13.5 
93

清洁和简单的:

awk '{print $2}' < file.txt | paste -s -d, - 
+1

对我的需求非常满意,我忘记了粘贴命令。 – 2014-04-22 20:08:04

+2

这是这里最好的答案,显然是这样做的正确方法 – forresthopkinsa 2016-09-20 04:03:46

+0

如何用单/双引号引用每个值? – Hussain 2016-12-15 09:05:56

2

试试这个:

sedSelectNumbers='s".* \(+[0-9]*[.][0-9]*\) .*"\1,"' 
sedClearLastComma='s"\(.*\),$"\1"' 
cat file.txt |sed "$sedSelectNumbers" |tr -d "\n" |sed "$sedClearLastComma" 

好事是删除换行符 “\ n” 个字符容易的部分!

编辑:另一种很好的方式来连接线与sed单行是这样的:|sed ':a;N;$!ba;s/\n/ /g'here得到。

+0

编辑太棒了 - +1! – JoeG 2013-08-30 13:34:10

0

另一个Perl的溶液,类似于丹Fego的AWK:

perl -ane 'print "$F[1],"' file.txt | sed 's/,$/\n/' 

-a告诉Perl输入线分成@F阵列,其被索引从0开始。

1

可以使用grep

grep -o "+\S\+" in.txt | tr '\n' ',' 

指找到开始+字符串,接着任意字符串\S\+,然后将换行符转换为逗号。对于大文件,这应该很快。

0

溶液用纯击:

#!/bin/bash 

sometext="something1: +12.0 (some unnecessary trailing data (this must go)) 
something2: +15.5 (some more unnecessary trailing data) 
something4: +9.0 (some other unnecessary data) 
something1: +13.5 (blah blah blah)" 

a=() 
while read -r a1 a2 a3; do 
    # we can add some code here to check valid values or modify them 
    a+=("${a2}") 
done <<< "${sometext}" 
# between parenthesis to modify IFS for the current statement only 
(IFS=',' ; printf '%s: %s\n' "Result" "${a[*]}") 

结果:+ 12.0,+ 15.5,+ 9.0,+ 13.5

3
cat data.txt | xargs | sed -e 's/ /, /g' 
1

不要看到使用awk这种简单的解决方案

awk 'b{b=b","}{b=b$2}END{print b}' infile 
0

awk one liner

$ awk '{printf (NR>1?",":"") $2}' file 

+12.0,+15.5,+9.0,+13.5 
相关问题