Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将多行字符串转换为单逗号分隔字符串_String_Bash_Shell_Csv - Fatal编程技术网

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

String 将多行字符串转换为单逗号分隔字符串,string,bash,shell,csv,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.

假设我有以下字符串:

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

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


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

      fg@erwin~$perl-ne'push@l,(拆分(/\s+/)[1];结束{print join(“,”,@l)。“\n”}您还可以通过两个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调用删除不感兴趣的数据,第二个调用连接所有行。

      这应该也可以

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

      这可能适合您:

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

      对于文件中的每一行;切掉第一个字段和后面的空格,切掉第二个字段后面的行的剩余部分并附加到保留空格。删除除最后一行(交换到保留空间)之外的所有行,并在开始删除引入的换行符后,将所有换行符转换为

      注意事项可以写为:

      sed 's/\S\+\s\+//;s/\s.*//;1h;1!H;$!d;x;s/\n/,/g' file
      

      您也可以这样打印:

      Just 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
      
      简洁明了:

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

      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、 美元!文学士;s/\n//g'
      来自另一个Perl解决方案,类似于Dan Fego的awk:

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

      -a
      告诉perl将输入行拆分为@F数组,该数组从0开始索引。

      您可以使用
      grep

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

      它查找以
      +
      开头的字符串,后跟任何字符串
      \S\+
      ,然后将新行字符转换为逗号。对于大型文件,这应该非常快。

      一个用纯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[*]}")
      
      #/bin/bash
      sometext=“something1:+12.0(一些不必要的尾随数据(必须删除))
      something2:+15.5(一些更不必要的尾随数据)
      something4:+9.0(其他一些不必要的数据)
      某物1:+13.5(诸如此类)
      a=()
      读取时-r a1 a2 a3;做
      #我们可以在这里添加一些代码来检查有效值或修改它们
      a+=(“${a2}”)
      
      完成没有看到awk的简单解决方案

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

      awk一个衬里

      $ awk '{printf (NR>1?",":"") $2}' file
      
      +12.0,+15.5,+9.0,+13.5
      

      嗯,最困难的部分可能是选择第二个“列”,因为我不知道有什么简单的方法可以将多个空间视为一个。对于其他人来说,这很容易。使用bash替换

      # cat bla.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)
      
      # cat bla.sh
      OLDIFS=$IFS
      IFS=$'\n'
      for i in $(cat bla.txt); do
        i=$(echo "$i" | awk '{print $2}')
        u="${u:+$u, }$i"
      done
      IFS=$OLDIFS
      echo "$u"
      
      # bash ./bla.sh
      +12.0, +15.5, +9.0, +13.5
      
      尝试以下简单代码:

      awk '{printf("%s,",$2)}' File1
      

      另一个AWK解决方案


      使用第二列形成以逗号分隔的列表。像往常一样在标准输入中或作为文件名参数进行输入。

      干杯,如果awk的输入是通过标准输入(在您的示例中,只需将
      函数| awk…
      放进去?编辑太棒了-+1!awk:invalid-v选项:(在-v和ORS=,(对我来说,在osx上)之间添加一个空格如何使用相同的命令来分离管道?
      awk-v ORS=|“{print$1}”DCMC.rtf | sed's/,$/\n/”
      得到一个错误奇怪的是,当我尝试这样做时,输出是空的。我认为对于管道版本,它应该是
      {print$1}
      否则,我在输出中只得到逗号这是这里最好的答案,显然是正确的方法。我如何用单引号/双引号引用每个值?@Hussain
      cat thing | awk-F',“{print”\''''''''''''''''.''''''.'''''''.'''''.''''''''.''.'粘贴-s-d'.
      如何使用
      ,'
      ,'
      作为分隔符?记住要处理Windows换行符如果在字符串中有任何CRLFs,让我们退一步,把这个线程看作BASH作为编程语言的一个明显的罪名。考虑斯卡拉的<代码> ListFox MKString“,,或者Haskell的<代码>闰”,“ListFoString >相关:它增加了一个额外的COMMALL说明符<代码>“%s”,
      应添加在
      printf
      之后,以使其更健壮,即使其能够处理所有类型的行,例如“foo%s”。或者,您可以使用
      read-r-acols
      ,然后添加
      “${cols[1]}
      到列表
      a
      中。我也喜欢这样的解决方案,但是-e arg在这里是必要的,因为sed只使用了第一个命令吗?我相信
      cat data.txt | xargs | sed's/,/g'
      会起同样的作用。例如,
      echo-e“foo\nbar\nbazz”| xargs | sed's/,/g'
      输出foo、bar、bazz。
      awk 'b{b=b","}{b=b$2}END{print b}' infile
      
      $ awk '{printf (NR>1?",":"") $2}' file
      
      +12.0,+15.5,+9.0,+13.5
      
      # cat bla.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)
      
      # cat bla.sh
      OLDIFS=$IFS
      IFS=$'\n'
      for i in $(cat bla.txt); do
        i=$(echo "$i" | awk '{print $2}')
        u="${u:+$u, }$i"
      done
      IFS=$OLDIFS
      echo "$u"
      
      # bash ./bla.sh
      +12.0, +15.5, +9.0, +13.5
      
      awk '{printf("%s,",$2)}' File1
      
      awk '{printf "%s", $c; while(getline){printf "%s%s", sep, $c}}' c=2 sep=','