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}
否则,我在输出中只得到逗号这是这里最好的答案,显然是正确的方法。我如何用单引号/双引号引用每个值?@Hussaincat 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=','