我有一个脚本,我从标准输入接收数据作为由换行符分隔的参数,说我有
string1,string2
string3,string4
我想单独采取string1,string2
和string3,string4
。但我收到了未知数量的此类行,我的脚本仅读取前两行,然后停止。我尝试\n
从标准输入解析,但它不起作用。我应该如何处理这个问题?
我尝试像这样阅读
for i in "$@"
do
var1=$(echo "$i" | cut -f2 -d,)
var2=$(echo "$i" | cut-f2 -d,)
#etc
我实际上想要完成的是说我有一个input.txt
包含该类型输入的文件:
string1,string2
string3,string4
如果我这样做,cat input.txt | ./myscript.sh
我想获取,无论我有多少行字符串,我都想获取每一行并stringI,stringJ
分别从两个变量中提取。
答案1
如果要进行文本处理,那么最明显的是使用awk
专门为此设计的(尽管也可以使用perl
or )sed
awk -F, '{print "something with "$1" and "$2}'
如果输入是实际的 CSV,它可能具有更复杂的值,例如:
"field, with comma" , "and with
newline", "or ""quotes"""
您可能想要使用perl
或python
或 一些专用的 csv 解析实用程序。
如果这些字段必须作为 shell 变量提供,因为例如您需要使用这些字段作为参数运行一些特定的命令,那么您需要执行以下操作:
while IFS=, read -r a b rest; do
something-with "$a" "$b"
done
另请参阅 GNUparallel
并行运行:
PARALLEL_SHELL=sh parallel -C, 'something-with {1} {2}'
但要注意 GNUparallel
会带来巨大的开销,因此并行化必须是值得的。
shellksh93
实际上可以理解 CSV 格式(处理单个字段的引用,如上面的复杂示例)
while IFS=, read -rS a b rest; do
do-something-with "$a" "$b"
done
答案2
我建议您可以使用带有 -d 选项的 read 来获取多行用户输入。
或使用tr '\n' ' '
将新行转换为空格,这是很hacky的。
我不知道一种方法,但你可以使用 tr 将 EOF 转换为新行,这样它将完美地满足你的期望。
如果您需要更多具体信息,请随时发表评论。
答案3
如果(出于某种原因)你想将所有输入行放入一个数组中,在 bash 中你可以使用
readarray -t input_lines
然后每一行都存储为索引数组的一个元素input_lines
。是-t
从每行中去除换行符。