我正在尝试使用bash
根据数字与/home/cmccabe/Desktop/percent
中其他文本文件的部分匹配,重命名/更新/home/cmccabe/Desktop/analysis.txt
中文本文件的文件名。匹配将始终位于此文件的第3,4或5行中。我无法做到这一点,但希望下面的'bash`是一个开始。谢谢你:)。
/home/cmccabe/Desktop/percent
中的文本文件 - 此目录中最多可能包含3个文件
00-0000_fbn1_20xcoverage.txt
/home/cmccabe/Desktop/analysis.txt
status: complete
id names:
00-0000_Last-First
01-0101_LastN-FirstN
02-0202_La-Fi
/home/cmccabe/Desktop/percent
00-0000_Last-First_fbn1_20xcoverage.txt
的bash
for filename in /home/cmccabe/Desktop/percent/*.txt; do echo mv \"$filename\" \"${filename//[0-9]-[0-9]/}\"; done < /home/cmccabe/Desktop/analysis.txt
答案 0 :(得分:1)
使用while-loop
的正确Process-Substitution语法,
您可以在/home/cmccabe/Desktop/percent
#!/bin/bash
# ^^^^ needed for associative array
# declare the associative array
declare -A mapArray
# Read the file from the 3rd line of the file and create a hash-map
# as mapArray[00-0000]=00-0000_Last-First and so on.
while IFS= read -r line; do
mapArray["${line%_*}"]="$line"
done < <(tail -n +3 /home/cmccabe/Desktop/analysis.txt)
# Once the hash-map is constructed, rename the text file accordingly.
# echo the file and the name to be renamed before invoking the 'mv'
# command
for file in *.txt; do
echo "$file" ${mapArray["${file%%_*}"]}"_${file#*_}"
# mv "$file" ${mapArray["${file%%_*}"]}"_${file#*_}"
done
答案 1 :(得分:1)
这是另一种类似的bash方法:
while IFS="_" read -r id newname;do
#echo "id=$newid - newname=$newname" #for cross check
oldfilename=$(find . -name "${id}*.txt" -printf %f)
[ -n "$oldfilename" ] && echo mv \"$oldfilename\" \"${id}_${newname}_${oldfilename#*_}\";
done < <(tail -n+3 analysis)
我们读取分析文件,并使用_
作为分隔符将每一行(即00-0000_Last-First)拆分为两个字段:
ID = 00-000
newname = Last-First
然后使用此文件ID我们从文件&#34;分析&#34;我们检查(使用find)以查看是否存在以相同ID开头的文件
如果存在这样的文件,则在变量$ oldfilename中返回它的文件名
如果这个变量不是空的那么我们做mv。
tail -n + 3用于忽略文件results.txt