【问题标题】:How to name files after values of a variable in a dataset?如何在数据集中变量的值之后命名文件?
【发布时间】:2021-12-01 06:29:24
【问题描述】:

我有一个包含 4 列的列表文件。 (每列包含+100行)

对于每一行,我必须创建一个包含 column3 值的目录,并将它们放置在包含 column4 值的目录中。 和 对于每一行,我应该将 column2 的值放入以 column1 命名的文件中。这些文件应该放在column3的目录中。

我创建了一个while循环:

#!/bin/bash
  
 file1=$column3
 file2=$column4 
  
 while read line
    do
      mkdir $column3 
      mkdir $column3/$column4 
      echo -e "$line"                                                                                                                                             
 
    done <list.csv

但这不起作用......有什么想法吗?

【问题讨论】:

  • 最好有一个输入示例,输出应该是什么样子
  • edit您的问题更多地说明什么不起作用。您是否看到错误消息?如果是这样,它是什么?它没有产生预期的输出?如果没有,你看到了什么输出,你期望什么输出?

标签: bash loops file while-loop mkdir


【解决方案1】:

假设有一个空格分隔符和规范

对于每一行,我必须创建一个包含 column3 值的目录,并将它们放置在包含 column4 值的目录中。并且对于每一行,我应该将 column2 的值放入以 column1 命名的文件中。这些文件应该放在 column3 的目录下。

create a directory containing the value of column3 措辞不清楚,但如果它的意思是“创建一个以第 3 列的值命名的目录”,对于第 4 列也是如此,那么,

while read -r one two three four; do
    mkdir -p "$four/$three"
    echo "$two" > "$four/$three/$one"
done < list.csv

仔细阅读您的操作数顺序。
mkdir -p 允许一次创建多个级别,并且如果它们已经存在则不会崩溃。

您也可以使用数组,但您需要将偏移量调整为以 0 为底,因此将代码与方向匹配不太清楚。

while read -r -a col; do
    mkdir -p "${col[3]}/${col[2]}"
    echo "${col[1]}" > "${col[3]}/${col[2]}/${col[0]}"
done < list.csv

如果您有不同的分隔符,请设置 IFS。例如,如果您的分隔符是逗号,请使用

while IFS=, read -r one two three four

而不仅仅是

while read -r one two three four

如果你的文件更多是关于格式的

"a", "b", "c", "d"

那么您可能应该使用awk,但为了bash 的完整性,您可以使用类似-

while IFS=, read -r one two three four; do
    mkdir -p "$four/$three"
    echo "$two" > "$four/$three/$one"
done < <( sed 's/^ *"//; s/" *$//; s/", *"/,/g' list.csv )

假设在任何字段中都没有逗号嵌入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多