我有一个包含一些文件的文件夹,我正在尝试使用逗号分隔的文件名填充变量。这是我到目前为止所尝试的
我的文件夹包含所需的文件
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
答案 0 :(得分:1)
请注意,只有当您的脚本与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中不保证数组,除了一个:参数列表。如果您不想覆盖全局参数列表,则可以使用函数生成范围。因此:
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}
与任何内容不匹配怎么办?然后*.bam
以files
结束;检查一下可能是个好主意。
答案 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;
}