Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Bash 使用shell脚本将逗号分隔的值转换为值列表_Bash_Shell_Unix_Cut - Fatal编程技术网

Bash 使用shell脚本将逗号分隔的值转换为值列表

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

我有如下csv数据:

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