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==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