선택 기준에 따라 파일/테이블 이동

선택 기준에 따라 파일/테이블 이동

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/

위 코드의 기능에 대한 간략한 소개: 이름이 지정된 모든 디렉터리/파일 조합을 반복하고 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

관련 정보