我可以将文件的文件名更改为文件中的第一个单词。
for fname in lrccas1
do
cp $fname $(head -1 -q $fname|awk '{print $1}')
done
但我想把它扩展到插图中。
for fname in lrccas1
do
cp $fname $(head -1 -q $fname|awk '{print $1 FILENAME}')
done
我尝试过不同的变体,但似乎都不起作用。有简单的解决方案吗?
亲切问候Svend
首先,让我们了解为什么你没有得到想要的结果
head -1 -q $fname|awk '{print $1 FILENAME}'
您正在将head
命令的标准输出重定向到awk
命令,即awk
正在读取标准输入,因此FILENAME
设置为空字符串。当GNUAWK
使用标准输入时询问FILENAME
没有多大意义,因为只有数据通过管道传输,可能根本没有输入文件之类的东西,例如
seq 10 | awk '{print $1*10}'
其次,让我们找到获得所需结果的方法,您可以访问文件名和成功提取的单词,因此您可以将它们连接到
for fname in lrccas1
do
cp $fname "$(head -1 -q $fname|awk '{print $1}')$fname"
done
第三,我必须警告您,您的命令确实复制(cp
(而不是重命名文件(rm
(,并且不关心目标名称是否存在——如果存在,它将被覆盖。
您可以在纯bash
(或sh
(中进行
for fname in lrccas1
do
read -r word rest < "$fname" && cp "$fname" "$word$fname"
done
这将执行您的shell脚本试图执行的操作:
awk 'FNR==1{close(out); out=$1 FILENAME} {print > out}' lrccas1
但你可能想考虑这样的东西:
awk 'FNR==1{close(out); out=$1 FILENAME "_new"} {print > out}' *.txt
这样你新创建的文件就不会覆盖现有的文件,然后删除原始文件将是:
awk 'FNR==1{close(out); out=$1 FILENAME "_new"} {print > out}' *.txt &&
rm -f *.txt
这假设您的原始文件有一些后缀,如.txt
或其他识别原始文件的方式,或者您将所有原始文件都放在某个目录中,如$HOME/old,并可以将新文件放在新目录中,例如$HOME/new:
cd "$HOME/old" &&
mkdir -p "$HOME/new" &&
awk -v newDir="$HOME/new" 'FNR==1{close(out); out=newDir "/" $1 FILENAME} {print > out}' * &&
echo rm -f *
在完成测试时移除echo
,并对结果感到满意。
尝试执行以下操作:(bash(
for fname in file_name
do
cp $fname "$(head -1 -q $fname|awk '{print $1}')$fname"
done