文件有很多行,每行包含
int folder-name file-path file-path file-path
例如
1001 AS35_59328 RICwdsRSYHSD11-2-IPAAPEK-93 /ifshk5/BC_IP/PROJECT/T1
1073/T11073_RICekkR/Fq/AS35_59328/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IP
AAPEK-93_1.fq.gz /ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-9322121_2.fq.gz
所以我怎样才能获得文件夹名称(AS35_59328)并创建文件夹(如果没有创建)。
获取行第二部分AS35_59328,如果AS35_59328已经存在,将行中的所有文件放入文件夹,否则创建AS35_59328文件夹然后将文件放入
答案 0 :(得分:0)
$ cat stack.txt
1001 AS35_59328 RICwdsRSYHSD11-2-IPAAPEK-93 /ifshk5/BC_IP/PROJECT/T1
1073/T11073_RICekkR/Fq/AS35_59328/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IP
AAPEK-93_1.fq.gz /ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-9322121_2.fq.gz
$for j in $(for i in `cat stack.txt | tr '\n' '\0' | grep -a -o '/.*gz'`; do echo $i ; done | awk -F\/ '{ print $NF }'); do echo $j ; done
111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz
111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz
111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-9322121_2.fq.g
最终oneliner:
这一个衬垫将帮助您获取所有文件名,然后它将所有这些提取的文件名复制到AS35_59328
。如果AS35_59328
不存在,它将创建这样一个目录,然后将所有这些文件放入其中。
if [ -d "AS35_59328"]; then for j in $(for i in `cat stack.txt | tr '\n' '\0' | grep -a -o '/.*gz'`; do echo $i ; done | awk -F\/ '{ print $NF }'); do cp -v $j AS35_59328/ ; done ; else for j in $(for i in `cat stack.txt | tr '\n' '\0' | grep -a -o '/.*gz'`; do echo $i ; done | awk -F\/ '{ print $NF }'); do mkdir AS35_59328 && cp -v $j AS35_59328/ ; fi
答案 1 :(得分:0)
另一种纯粹的shell解决方案:
while read line; do
set $line
key=$1; shift
dir=$1; shift
test -d $dir || mkdir $dir
mv $@ $dir
done < myfile.txt
bll-laptop:bll$ cat t.sh
#!/bin/bash
cat > myfile.txt << _HERE_
1001 d1 a b c
1002 d2 d e f
1003 d3 g h i
_HERE_
touch a b c d e f g h i
rm -rf d1 d2 d2 > /dev/null 2>&1
mkdir d1
while read line; do
set $line
key=$1; shift
dir=$1; shift
test -d $dir || mkdir $dir
mv $@ $dir
done < myfile.txt
ls -R
bll-laptop:bll$ ./t.sh
.:
d1 d2 d3 myfile.txt t.sh
./d1:
a b c
./d2:
d e f
./d3:
g h i
bll-laptop:bll$