如何用逗号而不是空格分割列表

     2023-02-24     249

关键词:

【中文标题】如何用逗号而不是空格分割列表【英文标题】:How to split a list by comma not space 【发布时间】:2011-12-04 19:42:54 【问题描述】:

我想在for foo in list 中用逗号, 而不是空格 分割文本。假设我有一个 CSV 文件 CSV_File,其中包含以下文本:

Hello,World,Questions,Answers,bash shell,script
...

我使用以下代码将其拆分为几个单词:

for word in $(cat CSV_File | sed -n 1'p' | tr ',' '\n')
do echo $word
done

打印出来:

Hello
World
Questions
Answers
bash
shell
script

但我希望它用逗号而不是空格分隔文本:

Hello
World
Questions
Answers
bash shell
script

如何在 bash 中实现这一点?

【问题讨论】:

@Carl 你能提供一个使用awk的例子吗? 【参考方案1】:

使用 subshel​​l 替换来解析单词会撤消您将空格放在一起所做的所有工作。

试试吧:

cat CSV_file | sed -n 1'p' | tr ',' '\n' | while read word; do
    echo $word
done

这也增加了并行性。在您的问题中使用子外壳会强制整个子外壳过程完成,然后您才能开始迭代答案。管道到子外壳(如我的回答)让它们并行工作。当然,这仅在文件中有很多行时才重要。

【讨论】:

是的,这比我建议的要好得多。 +1 l33t bash 技能 mkj :) 甚至不需要while循环。 目前不需要while循环,但我理解echo的调用作为一些更有趣命令的代理;也就是说,OP 希望 shell 变量中的多字 CSV 内容与其他一些任意命令一起使用。这就是为什么我使用 read 来演示如何将内容放入 shell 变量中。 请注意,如果输入包含换行符,这将无法按预期工作(然后它将在逗号 最初出现在输入中的换行符上拆分,即 @987654325 @ 将被拆分为 4 个字段,而不是所需的 3)。对于 Bash,我建议使用单命令范围的 IFS 设置与 read -aread -d(参见 proper IFS setting in Bash)结合使用,但对于 POSIX shell,我发现 substring processing 是唯一干净且愚蠢的-证明解决方案。【参考方案2】:

将IFS 设置为,:

sorin@sorin:~$ IFS=',' ;for i in `echo "Hello,World,Questions,Answers,bash shell,script"`; do echo $i; done
Hello
World
Questions
Answers
bash shell
script
sorin@sorin:~$ 

【讨论】:

不错!我完全忘记了 IFS 环境变量! 要在脚本中使用它,您应该将 IFS 变量恢复为之前的值。请参阅 Andrew Newdigate 的回答。 @Sorin:通过“在脚本中使用它”,我的意思是需要更多的代码而不只是这个,因此您希望重置 IFS 以避免任何意外行为。 IFS 的含义似乎相当广泛,所以最好是懒惰而不是不清楚。顺便提一句。如果你像你的答案一样运行你的命令,它会改变当前环境的 IFS,你很容易忘记这一点,然后想知道为什么你的 shell 表现得如此奇怪。【参考方案3】:

我认为规范的方法是:

while IFS=, read field1 field2 field3 field4 field5 field6; do 
  do stuff
done < CSV.file

如果你不知道或不在乎有多少字段:

IFS=,
while read line; do
  # split into an array
  field=( $line )
  for word in "$field[@]"; do echo "$word"; done

  # or use the positional parameters
  set -- $line
  for word in "$@"; do echo "$word"; done

done < CSV.file

【讨论】:

非常方便,可以按名称引用特定字段 @glenn-jackman 你是对的,规范的 UNIX 会使用你的第一种方法。第二个仅适用于 bash 或 zsh 的现代实现。 bash 的 read 命令有一个 -a 选项,可以将行中的单词读入数组:while read -a words; do for word in "$words[@]" ...【参考方案4】:
kent$  echo "Hello,World,Questions,Answers,bash shell,script"|awk -F, 'for (i=1;i<=NF;i++)print $i'
Hello
World
Questions
Answers
bash shell
script

【讨论】:

我假设echo $word 实际上并不是真正需要使用 $word 完成的事情。在这种情况下,您的 awk expession 是在原始问题中执行 sed 和 tr 的另一种方法。我认为 Eng.Fouad 希望在 shell 变量中使用空格的值来做其他事情。 @mkj 此解决方案可以进一步用作 shell 变量,例如:FOO="Hello,World,Questions,Answers,bash shell,script"; BOO=$(echo $FOO | awk -F, 'for (i=1;i&lt;=NF;i++)print $i'); for B in $BOO; do echo "&lt;$B&gt;"; done @RomanChernyatchik $BOO 上的循环为“bash”和“shell”产生了单独的变量,因此无法按 OP 的预期工作【参考方案5】:

创建一个 bash 函数

split_on_commas() 
  local IFS=,
  local WORD_LIST=($1)
  for word in "$WORD_LIST[@]"; do
    echo "$word"
  done


split_on_commas "this,is a,list" | while read item; do
  # Custom logic goes here
  echo Item: $item
done

...这会生成以下输出:

Item: this
Item: is a
Item: list

(注意,这个答案已经根据一些反馈进行了更新)

【讨论】:

很奇怪。知道为什么会发生这种情况吗? 副作用在这里解释superuser.com/questions/781766/ifs-separated-items-in-loop 为避免“副作用”,首先将 IFS var 存储在某处OLDIFS=$IFS,然后执行IFS=, sentences1=($sentences),最后恢复 IFS:IFS=$OLDIFS。否则,这就是我正在寻找的答案。谢谢。 @clime 和 Val,我已更新我的答案以考虑您的反馈。它似乎运作良好,但请告诉我您的想法。 我觉得你的帖子现在太复杂了。修复原始代码 sn-p 并在最后通过一个小注释向评论员致谢就足够了;)。但无论如何,没有什么是完美的。【参考方案6】:

阅读:http://linuxmanpages.com/man1/sh.1.php &http://www.gnu.org/s/hello/manual/autoconf/Special-Shell-Variables.html

IFS 用于分词的内部字段分隔符 展开后,用 read 将行拆分成单词 内置命令。默认值为“”。

IFS 是一个 shell 环境变量,所以它在你的 shell 脚本的上下文中保持不变,除非你导出它。还要注意,IFS 根本不可能从您的环境继承:请参阅此 gnu 帖子了解原因和有关 IFS 的更多信息。

你的代码是这样写的:

IFS=","
for word in $(cat tmptest | sed -n 1'p' | tr ',' '\n'); do echo $word; done;

应该可以,我在命令行上测试过。

sh-3.2#IFS=","
sh-3.2#for word in $(cat tmptest | sed -n 1'p' | tr ',' '\n'); do echo $word; done;
World
Questions
Answers
bash shell
script

【讨论】:

【参考方案7】:

你可以使用:

cat f.csv | sed 's/,/ /g' |  awk 'print $1 " / " $4'

echo "Hello,World,Questions,Answers,bash shell,script" | sed 's/,/ /g' |  awk 'print $1 " / " $4'

这是用空格代替逗号的部分

sed 's/,/ /g'

【讨论】:

如何用逗号分割不跟空格的字符串?

】如何用逗号分割不跟空格的字符串?【英文标题】:HowtosplitastringoncommathatisNOTfollowedbyaspace?【发布时间】:2014-08-0905:20:00【问题描述】:我希望结果是:Cats,Felines&CougarsDogsSnakes这是我能得到的最接近的。$string="Cats,Felines&C... 查看详情

如何用逗号分割字符串而不在perl的引号内包含逗号?

】如何用逗号分割字符串而不在perl的引号内包含逗号?【英文标题】:Howtosplitastringbycommawithoutincludingcommainsidethequotationmarkinperl?【发布时间】:2011-11-2211:46:57【问题描述】:我有以下代码:my$file=\'c:\\test.log\';open(FILE,"<",$file)ord... 查看详情

如何用括号外的逗号分割字符串?

】如何用括号外的逗号分割字符串?【英文标题】:Howtosplitastringbycommaspositionedoutsideofparenthesis?【发布时间】:2010-12-1112:52:27【问题描述】:我得到了这样格式的字符串:"WilburSmith(Billy,sonofJohn),EddieMurphy(John),ElvisPresley,JaneDoe(JaneDoe... 查看详情

如何用逗号分割行并在 PostgreSQL 中取消透视表?

】如何用逗号分割行并在PostgreSQL中取消透视表?【英文标题】:HowtosplittherowbyacommaandunpivotthetableinPostgreSQL?【发布时间】:2022-01-2320:58:30【问题描述】:我有这张表,我想用逗号分隔列并取消透视它我的桌子+------------+--------------... 查看详情

java如何用部分空格分割字符串,急!

比如:Jun1004:03:20iomc2312时间里的空格不分割,但是时间与iomc231要分割开来这只是个例子,主要是在一行字符串里,我需要分割字符串放到arraylist中去,但是只用split的话所有的空格都会被分割,而有些内容本身含有空格,不能被... 查看详情

如何用空格分割字符串,不包括Python中双引号之间的空格? [复制]

】如何用空格分割字符串,不包括Python中双引号之间的空格?[复制]【英文标题】:HowtosplitastringbyspacesexcludingonesbetweendoublequotesinPython?[duplicate]【发布时间】:2021-03-2611:15:06【问题描述】:我正在尝试将文本拆分为Python中的列表... 查看详情

使用“MultiAutoCompleteTextView”时如何用空格替换逗号

】使用“MultiAutoCompleteTextView”时如何用空格替换逗号【英文标题】:HowtoreplacethecommawithaspacewhenIusethe"MultiAutoCompleteTextView"【发布时间】:2011-03-2919:40:11【问题描述】:我正在做一个简单的程序,使用MultiAutoCompleteTextView在... 查看详情

如何用字符串分隔的逗号填充 C# 列表框

】如何用字符串分隔的逗号填充C#列表框【英文标题】:HowtopopulatedC#listboxwithstringseparatedcomma【发布时间】:2020-10-1911:35:09【问题描述】:我有一个用逗号分隔的字符串,如下所示:"test1,test2,test3"我想用以下代码将这些字符串转... 查看详情

PySpark:如何用逗号指定列作为十进制

】PySpark:如何用逗号指定列作为十进制【英文标题】:PySpark:Howtospecifycolumnwithcommaasdecimal【发布时间】:2018-10-0812:43:48【问题描述】:我正在使用PySpark并加载一个csv文件。我有一列包含欧洲格式的数字,这意味着逗号替换了点... 查看详情

如何用“-”替换多余的空格(不是空格)?

】如何用“-”替换多余的空格(不是空格)?【英文标题】:HowcanIreplaceblankextraspaces(notwhite-spaces)with\'-\'?【发布时间】:2015-03-1117:49:02【问题描述】:我有这样的字符串:varcontent="Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodt... 查看详情

java中如何用split对一个字符串按逗号和分号分割成数组

java中如何对一个字符串按逗号和分号分割成数组参考技术Aimport java.util.Arrays;public class Day21_A  public static void main(String[] args)  String[] arr=new String("张三,李四,王五;赵六").split("[\\\... 查看详情

如何用空格填充 QString?

】如何用空格填充QString?【英文标题】:HowdoIpadaQStringwithspaces?【发布时间】:2011-11-0917:57:39【问题描述】:如何在QString的末尾填充空格?例如,我希望QString总共有4个字符,并且它只有1个字符长。我希望最后3个是空格。【问... 查看详情

如何用空格或缩进注释多行

】如何用空格或缩进注释多行【英文标题】:Howtocommentmultiplelineswithspaceorindent【发布时间】:2012-12-1105:52:38【问题描述】:在VisualStudio2010中,我有多行文本需要注释:ABC使用CTRL+E+C注释掉多行,我得到//A//B//C我想在//和A之间有一... 查看详情

如何用包含空格的字符串替换列表中的项目?

】如何用包含空格的字符串替换列表中的项目?【英文标题】:HowcanIreplaceaniteminalistwithastringthathasaspaceinit?【发布时间】:2021-12-1211:18:35【问题描述】:我试图简单地用另一个项目替换一个列表项,但新项目中有一个空格。当它... 查看详情

python如何用print打印出列表

直接使用print函数就可以了,举个例子:L=['apple','fruit']#定义一个列表print(L)#输出一个列表输出结果就是['apple','fruit']。扩展资料:不带输出项的print即为输出一个空行,如果之前的print语句输出项的最后... 查看详情

如何在映射列表中使用而不是逗号

】如何在映射列表中使用而不是逗号【英文标题】:Howuseinsteadofcommainmappedlist【发布时间】:2021-12-1310:44:39【问题描述】:我的代码--matchkey:caselist(map(ord,map(str,range(1,10))):#...这个地图功能使这种格式--[ord(\'1\'),ord(\'2\'),ord(\'3\'),...]... 查看详情

如何用空格替换单个 ,但如果有多个 s 则不行?

】如何用空格替换单个,但如果有多个s则不行?【英文标题】:HowcanIreplacesingle&nbsp;\'swithaspacebut,notiftherearemultiple&nbsp;s?【发布时间】:2013-07-1902:33:09【问题描述】:我认为正则表达式可能会解决问题,但我无法想出一个有... 查看详情

如何用java解析csv文件

首先看一下csv文件的规则:csv(CommaSeparateValues)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔。windows默认用excel打开。它的格式包括以下几点(它的格式最好就看excel是如何解析的。):①每条... 查看详情