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非常感谢