如何在shell中填充带有文件名的变量

时间:2017-07-28 23:59:38

标签: shell

我有一个包含一些文件的文件夹,我正在尝试使用逗号分隔的文件名填充变量。这是我到目前为止所尝试的

我的文件夹包含所需的文件

examples/NMD_DBL1.tiny.bam
examples/NMD_DBL2.tiny.bam
examples/NMD_WT1.tiny.bam
examples/NMD_WT2.tiny.bam
examples/SRR2240277.bam
examples/SRR2240278.bam

当我运行时,我得到以下

for i in examples/*bam; do echo $i | cut -d "/" -f 2 | tr "\n" ","; done
NMD_DBL1.tiny.bam,NMD_DBL2.tiny.bam,NMD_WT1.tiny.bam,NMD_WT2.tiny.bam,SRR2240277.bam,SRR2240278.bam,[upendra_35@rogue python]$ 

当我尝试将输出分配给变量时,我只获得一个文件名后跟逗号

for i in examples/*bam; do new=$(echo $i | cut -d "/" -f 2 | tr "\n" ","); done
echo $new
SRR2240278.bam,

如何将所有文件放入变量new,并用逗号分隔?

  

新= NMD_DBL1.tiny.bam,NMD_DBL2.tiny.bam,NMD_WT1.tiny.bam,NMD_WT2.tiny.bam,SRR2240277.bam,SRR2240278.bam

4 个答案:

答案 0 :(得分:1)

在bash中

请注意,只有当您的脚本与bash一起运行而不是sh时,才能保证以下内容有效。确保它以#!/usr/bin/env bash#!/usr/bin/env bash或类似内容开头。

使用您的文件列表填充数组:

files=( examples/*.bam )     # put your list of names into an array
files=( "${files[@]##*/}" )  # remove directory names from each

然后将该数组的内容放入以逗号分隔的字符串中:

IFS=,
files_str=${files[*]}

...或者,如果您不想修改IFS

printf -v files_str '%s,' "${files[@]}"  # expand the format string '%s,' for each
files_str=${files_str%,}                 # remove the last comma

在任何POSIX shell

在基准POSIX shell中不保证数组,除了一个:参数列表。如果您不想覆盖全局参数列表,则可以使用函数生成范围。因此:

comma_separated_file_list() {
  # check that the first argument exists
  # if it doesn't, then the glob that generated our list came up empty
  [ -e "$1" ] || [ -L "$1" ] || return

  # consume arguments one at a time, append a "," after each that isn't last.
  while [ "$#" -gt 0 ]; do
    if [ "$#" -gt 1 ]; then
      printf '%s,' "${1##*/}"
    else
      printf '%s' "${1##*/}"
    fi
    shift
  done
}

new=$(comma_separated_file_list examples/*.bam)

这样做的好处是,如果不存在examples/*.bam的匹配项,那么您的变量new将结束为空(并且comma_separated_file_list函数将返回错误的退出状态,您可以分支)。

答案 1 :(得分:0)

我认为将整个for循环的输出分配给new应该可以正常工作,

new = $(for i in examples/*bam; do echo $i | cut -d "/" -f 2 | tr "\n" ","; done) echo $new

答案 2 :(得分:0)

decision_function_shape='ovr'

这里使用的技巧是files=$(printf "%s," *.bam) # files a trailing comma files=${files%,} # ... but not any more 具有如下属性:如果它具有比转换说明符更多的参数,则它通过格式字符串重复其他参数。强制性演示:

printf

因此,使用$ printf "(%s - %s)\n" a b c d e f g h (a - b) (c - d) (e - f) (g - h) ,我们可以遍历参数并为每个参数添加逗号;但当然,我们希望逗号分开,而不是终止。普通的旧POSIX "%s,"扩展可以解决这个问题。

如果${var%pat}与任何内容不匹配怎么办?然后*.bamfiles结束;检查一下可能是个好主意。

答案 3 :(得分:-1)

我将在这里回答我自己的问题

Dictionary<string, int> _columnIndiciesForAbcGridView = null;

protected void detailsReportGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (_columnIndiciesForAbcGridView == null)
    {
        int index = 0;
        _columnIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells
            .Cast<TableCell>()
            .ToDictionary(c => c.Text, c => index++);
    }

    // Add a column, this shifts the _columnIndiciesForAbcGridView though.

    TableCell cell = new TableCell();
    cell.Text = "new Column";
    e.Row.Cells.AddAt(2, cell);

    // Swap 0 and 1

    int c0 = _columnIndiciesForAbcGridView["ConfigId"];
    int c1 = _columnIndiciesForAbcGridView["CreatedUtc"];

    string text = e.Row.Cells[c0].Text;
    e.Row.Cells[c0].Text = e.Row.Cells[c1].Text;
    e.Row.Cells[c1].Text = text;
}