【问题标题】:Read multi variable csv bash build multi line file from it从中读取多变量 csv bash 构建多行文件
【发布时间】:2018-10-28 19:23:11
【问题描述】:

我有一个我认为很简单的概念,我可以像做类似的事情一样轻松地做到这一点。

我有一个输入文件 input.csv

1a,1b
2a,2b

我想要以下输出

输出文件 1

This is variable 1 named 1a ok
This is variable 2 named 1b ok

输出文件 2

This is variable 1 named 2a ok
This is variable 2 named 2b ok

我想我可以做类似下面的事情

i=1
while IFS=, read var1 var2; do
echo This is variable 1 named "var1" > filenamei
echo This is variable 2 named "var2" >> filenamei
i=i+1
done </inputfile.csv

我之前编写了代码来从一个长文件中获取一个变量并将输出写入一个文件,它工作正常。如下所示

输入文件

a
b

单个输出文件

This is A
This is B

脚本是

while read p;do
echo this is "$p" >>output file
done < input file

经历了许多不同的错误,但一无所获。

【问题讨论】:

  • 输入文件中真的有空格吗?还是1a,1b等,不带空格?
  • 本例中没有空格。最终版本将包括一个时间戳
  • 对于每次迭代,文件被截断&gt;,而&gt;&gt; 追加,重定向可以移出循环
  • 但是您的示例输入确实显示空白。是不是错了?
  • 输入文件已更正。

标签: bash shell csv


【解决方案1】:

通过配置双循环将很容易:外部循环遍历行,内部循环用于逗号分隔的字段。那么怎么样:

#!/bin/bash

i=1
while read -r line; do
    ifs_back="$IFS"
    IFS=","
    set -- $line
    for ((j=1; j<=$#; j++)); do
        echo This is variable "$j" named "${!j}" >> "filename${i}"
    done
    IFS="$ifs_back"
    i=$((i+1))
done < "inputfile.csv"

说明:

  • 为了用逗号分隔输入行,我们暂时将IFS设置为“,”,然后将字段分配给位置参数$1$2
  • 内部循环的循环计数器 j 以 1 开头,以 $#1 结尾,字段数。
  • 我们可以通过${!j}访问位置参数的值。
  • 作为内部循环的清理,我们检索IFS 并为下一行增加i

上面的代码可以灵活地使用#lines 和#fields,因此可以使用输入:

1a,1b
2a,2b
3a,3b

还有:

1a,1b,1c
2a,2b,2c
3a,3b,3c

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2023-03-27
    • 2021-04-16
    相关资源
    最近更新 更多