Bash 使用shell脚本将逗号分隔的值转换为值列表
我有如下csv数据:Bash 使用shell脚本将逗号分隔的值转换为值列表,bash,shell,unix,cut,Bash,Shell,Unix,Cut,我有如下csv数据: a,b,c,d,e,f,g,h 我想把这些数据列在一个列表中,每行一个字母。是否可能是shell脚本?我尝试使用cut命令提取每个字母,如下所示: less list.txt | cut -d"," -f? 命令正在运行,但这里的问题是字段数未知。我必须将此命令放在循环中并在列表上迭代,以便逐个提取值并将其重定向到另一个文件。使用tr将,更改为新行: tr , "\n" < list.txt tr,“\n”>~/where/you/want 完成您可以为此使用s
a,b,c,d,e,f,g,h
我想把这些数据列在一个列表中,每行一个字母。是否可能是shell脚本?我尝试使用cut命令提取每个字母,如下所示:
less list.txt | cut -d"," -f?
命令正在运行,但这里的问题是字段数未知。我必须将此命令放在循环中并在列表上迭代,以便逐个提取值并将其重定向到另一个文件。使用
tr
将,
更改为新行:
tr , "\n" < list.txt
tr,“\n”
请参见是,您可以使用
cut
。关键点是--输出分隔符的用法。如果将其设置为新行,则一切正常:
cut -d',' --output-delimiter=$'\n' -f1- file
还请注意两个事实:
- 我们使用
-f1-
从第一个字段打印到最后一个字段。n-
语法的意思是:从第n个字段到结尾
- 我们使用
$'\n'
是因为\n
单独打印文本\n
而不是真正的新行
试验
从人工切割
:
--输出分隔符=字符串
使用字符串作为输出分隔符默认情况下使用输入
分隔符
您可以使用tr
命令将每个“,”转换为换行符
cat list.txt | tr "," "\n"
从那时起,您可以使用while-read循环将每一行输出到任何地方
cat list.txt | tr "," "\n" | while read LINE
do
echo "$LINE" >> ~/wherever/you/want
done
或者
while read LINE
do
echo "$LINE" >> ~/wherever/you/want
done <<< "$(cat list.txt | tr "," "\n")"
读取行时
做
回显“$LINE”>>~/where/you/want
完成您可以为此使用sed
:
sed "s/,/\n/g" list.txt
输出
a
b
c
d
e
f
您应该发布一些代码并指出您遇到的问题,这将使其他人更容易帮助您解决问题。旁白:使用less
将文件导入命令是很奇怪的。更传统的是cut file
,cut
,或者,如果您确实想使用管道,cat file | cut
。如果less完成了它通常的工作,你就必须不断点击空格键来完成,但实际上,它注意到标准输出不是你的屏幕,基本上会为你变成cat
。顺便说一句,.@Armfoot谢谢,尽管我已经在我的答案中发布了一些东西。也就是说,我看不出这增加了什么价值。但是谢谢你的支持。。。这只是一个真正的测试/摆弄/确认对使用它的人来说要好得多;)是的,我知道。但是它没有害处,不是吗?编写sed-r-s-u-l10000--posix-e“s/,/\n/g”
也没有害处。但是仍然毫无意义。使用-e
的价值在于,如果sed脚本需要以-
开头(这可能是可能的,也可能不是实际可能的)您无需记住添加-e
,如果您想向命令添加第二个脚本,您只需将-e
添加到末尾,而无需在第一个脚本之前添加-e
。也就是说,这并不重要。@EtanReisner我敢肯定,如果您以-
开头,这将是一个语法错误。我的观点是,这是一个单独的脚本,不是这样开始的。我知道当-e
有用时,就像我其他注释中的所有标志“可以”有用一样,只是在这种情况下不有用。@EtanReisner是的,因为这就是它的目的,显然其他标志不会这样做,尽管在需要它们的情况下它们都有用。这就像说-r
应该在那里,这样当您开始使用ERE时就不必记得添加它了。但OP不是,它们都不需要。
a
b
c
d
e
f