a
考虑描述城市温度序列的变量a
。我有 9 个目录(a1
, a2
, a3
, a4
, a5
, a6
, a7
, a8
, a9
),每个目录都包含一个表(分别为a1.txt
, a2.txt
, a3.txt
, a4.txt
, a5.txt
, a6.txt
, a7.txt
, a8.txt
, a9.txt
)。
我想将第一行和第四列(带有空格分隔符)处呈现最高值的表移动到另一个目录。有谁知道这是怎么做到的吗?
答案1
这就是我用来生成您正在讨论的文件的方法:
mkdir -p another/directory
for n in 1 2 3 4 5 6 7 8 9
do mkdir -p "a$n"
printf "$n $n $n 1$n $n $n $n $n\n" >"a$n/a$n.txt" #1 marks 4th col
done
这就是我使用的mv
文件:
mv "a$(((a=$(t=$(printf \\t)
paste a[1-9]/a[1-9].txt /dev/null |
sed -e"s/\( *[^ ][^ ]*[ $t]\)\{4\}[^$t]*/\1/g;y| |\n|;q" |
sort -rn | head -n1))-10))/a${a#1}.txt" another/directory
这就是我所做的来验证我是否正确:
cat another/directory/*
9 9 9 19 9 9 9 9
……但我没搞清楚。这取决于与文件名匹配的最高值。这不会:
file=$(
grep -n . ./a[1-9]/a[1-9].txt |
grep :1: | cut -d\ -f1,4 |
sort -rnk2,2
)
mv "${file%%:*}" another/directory
答案2
这不应该是一个“为我编写这个程序”的网站,所以我假设您不知道从哪里开始。所以这是一种方法:
#!/bin/bash
highest=-999
for x in a[0-9]/a[0-9].txt;do
fourth="$(awk 'NR==1{print $4}' $x)"
if [ $highest -lt $fourth ];then
highest=$fourth
hifile=$x
fi
done
echo "highest was $highest in $hifile"
mv $hifile high/
上面代码的作用简介:循环遍历名为 it 的所有目录/文件组合,使用 awk 将第一行 ( ) 中的a[0-9]/a[0-9].txt
第四个字段 ( ) 分配给变量 Fourth 。然后比较最高值是否小于第四个 ( ),如果是,则将文件名保存在 hifile 变量中。循环完成后,它将文件移动到目录“high”{print $4}
NR==1
if [ $highest -lt $fourth ];then
答案3
当然,有不止一种方法可以做到这一点,但这里有一种方法:
#!/bin/bash
# start out assuming 1 is the highest
highfile=a1/a1.txt
highval=$(head -1 a1/a1.txt | awk '{print $4}')
for a in `seq 2 9`
do
val=$(head -1 a$a/a$a.txt | awk '{print $4}')
if [ $val -gt $highval ]
then
highfile=a$a/a$a.txt
highval=$val
fi
done
echo mv $highfile destdir
答案4
轻而易举gawk
awk -v target_dir="$TARGET_DIR" '
{a[FILENAME] = $4; nextfile};
END{PROCINFO["sorted_in"]="@val_num_desc";
for(k in a){system("mv "k" "target_dir); exit}}' */*.txt