Bash 循环通过制表符分隔的文件
我有一个要求,其中我必须有一个“制表符分隔文件”,它有三列Bash 循环通过制表符分隔的文件,bash,shell,unix,Bash,Shell,Unix,我有一个要求,其中我必须有一个“制表符分隔文件”,它有三列 file_id file_name sample_id 30a6e42d 2f601196 TARGET-20-PABLDZ-04A 25fe4062 3ea58509 TARGET-20-PABLDZ-04A 839d38ec 5c971b6e TARGET-20-PABLDZ-04A 79f40af8 4a2ace7c TARGET-20-PA
file_id file_name sample_id
30a6e42d 2f601196 TARGET-20-PABLDZ-04A
25fe4062 3ea58509 TARGET-20-PABLDZ-04A
839d38ec 5c971b6e TARGET-20-PABLDZ-04A
79f40af8 4a2ace7c TARGET-20-PADYIR-09A
afb79159 fea2f740 TARGET-20-PADYIR-09A
177500c8 1eae7be6 TARGET-20-PADYIR-09A
每个示例\u id都有相应的3个文件\u id
我的要求是循环遍历所有样本id,并找到所有三个文件id
对于每个样本id
cd
(文件夹名称与文件id相同)。
文件夹与选项卡单独文件所在的位置相同。
获取文件名(文件存在于
文件夹中)
cp文件\u名称到一个目录
谢谢你的帮助你可以试试
while IFS=$'\t' read -r column1 column2 column3 ; do
printf "%b\n" "column1<${column1}>"
printf "%b\n" "column2<${column2}>"
printf "%b\n" "column3<${column3}>"
done < "myfile"
而IFS=$'\t'读取-r column1 column2 column3;做
printf“%b\n”列1
printf“%b\n”列2
printf“%b\n”列3
完成<“我的文件”
IFS=$'\t'是告诉bash选项卡是定界器只需使用awk的
系统
函数:注意,这将创建目录并尝试移动文件。读者请注意:在执行该命令之前,请先了解该命令的作用。也许在不同的地方插入“echo”以查看预期的行为
awk 'NR>1{cmd=sprintf("mkdir -p %s; mv %s/%s %s", $3, $1, $2, $3 ); system (cmd) }' input-file
这假设您希望将文件移动到第3列中指定的目录(您没有指明目标目录的名称,因此我在猜测),并在尝试移动文件之前创建该目录。到目前为止您尝试了什么?
sed 1d input file |同时读取文件_idfile _namesample |id;做完成
不确定您为什么认为需要光盘,或者在您已经知道文件名的情况下为什么需要获取文件名。似乎我之前评论中的省略号可以简单地替换为cp“$file\u id”/“$file\u name”target dir
,您就完成了。从OP示例中,您不需要在此处使用IFS。此命令的一个小问题是,它创建附加^M的目录those@user3151878^M之所以存在,是因为它存在于您的输入文件中。@William Pursell非常感谢