将多行字符串转换为单个逗号分隔

时间:2012-01-03 15:14:46

标签: string bash shell csv

假设我有以下字符串:

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?

18 个答案:

答案 0 :(得分:131)

干净简单:

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

答案 1 :(得分:76)

您可以使用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/,$//

答案 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)

好吧,最困难的部分可能是选择第二个“列”,因为我不知道将多个空间视为一个的简单方法。剩下的事情很简单。使用bash替换。 #猫bla.txt something1:+12.0(一些不必要的尾随数据(必须输入)) something2:+15.5(一些不必要的尾随数据) something4:+9.0(一些其他不必要的数据) something1:+13.5(等等等等) #猫bla.sh OLDIFS = $ IFS IFS = $'\ n' 为我在$(cat bla.txt)中;做   i = $(回显“ $ i” | awk'{print $ 2}')   u =“ $ {u:+ $ u,} $ i” 完成 IFS = $ OLDIFS 回声“ $ u” #bash ./bla.sh + 12.0,+ 15.5,+ 9.0,+ 13.5

答案 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