按照选择标准移动文件/表

按照选择标准移动文件/表

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==1if [ $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

相关内容