假设我有以下字符串:
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?
答案 0 :(得分:131)
干净简单:
awk '{print $2}' file.txt | paste -s -d, -
答案 1 :(得分:76)
您可以使用awk
和sed
:
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/,$//
)答案 2 :(得分:10)
$ 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
答案 3 :(得分:9)
cat data.txt | xargs | sed -e 's/ /, /g'
答案 4 :(得分:8)
这也应该有用
awk '{print $2}' file | sed ':a;{N;s/\n/,/};ba'
答案 5 :(得分:6)
这可能对您有用:
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
答案 6 :(得分:6)
awk 一个班轮
$ awk '{printf (NR>1?",":"") $2}' file
+12.0,+15.5,+9.0,+13.5
答案 7 :(得分:3)
试试这个:
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。
答案 8 :(得分:2)
尝试以下简单代码:
awk '{printf("%s,",$2)}' File1
答案 9 :(得分:2)
您可以使用grep
:
grep -o "+\S\+" in.txt | tr '\n' ','
找到以+
开头的字符串,后跟任何字符串\S\+
,然后将换行符转换为逗号。对于大文件,这应该很快。
答案 10 :(得分:2)
用awk
看不到这个简单的解决方案awk 'b{b=b","}{b=b$2}END{print b}' infile
答案 11 :(得分:1)
用纯Bash编写的解决方案:
#!/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
答案 12 :(得分:0)
另一个AWK解决方案
运行
awk '{printf "%s", $c; while(getline){printf "%s%s", sep, $c}}' c=2 sep=','
使用第二列来形成以逗号分隔的列表。像往常一样在标准输入中或作为文件名参数提供输入。
答案 13 :(得分:0)
答案 14 :(得分:0)
另一个Perl解决方案,类似于Dan Fego的awk:
perl -ane 'print "$F[1],"' file.txt | sed 's/,$/\n/'
-a
告诉perl将输入行拆分为@F数组,该数组从0开始编制索引。
答案 15 :(得分: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
答案 16 :(得分: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调用删除不感兴趣的数据,第二个连接所有行。
答案 17 :(得分:0)
使用perl:
fg@erwin ~ $ 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