두 번째 파일을 기반으로 파일 재정렬

두 번째 파일을 기반으로 파일 재정렬

순서가 잘못된 파일이 있습니다. 두 번째 파일을 사용하여 재정렬하고 싶습니다.

파일 1

1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0

2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0

3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0

ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0

그리고 두 번째 파일

3 HD
1 HD
2 HD

파일 2를 스캔하고 파일 1을 다시 정렬하고 남은 부분은 파일의 끝까지 수정되므로 최종 결과는 다음과 같습니다.

3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0
1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0
ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0

어떤 아이디어가 있나요?

미리 감사드립니다.

답변1

파일 크기에 따라 각 줄을 배열로 로드하는 것이 이를 처리하는 가장 쉬운 방법입니다. 인덱스 파일을 사용하여 객체 키(배열의 항목에 대한 참조)를 얻고 해당 줄, 루프 등을 작성합니다.

Linux/bash 태그를 지정하신 것으로 확인됩니다. 여기에 몇 가지 도우미 정보가 있습니다.

Bash 배열에는 번호가 매겨진 인덱스만 있지만 희박합니다. 즉, 모든 인덱스를 정의할 필요가 없습니다. 배열 항목을 괄호로 묶어 전체 배열을 할당할 수 있습니다.

  arr=(Hello World)

친숙한 배열 구문을 사용하여 개별 항목을 할당할 수 있습니다(Basic 또는 Fortran에 익숙하지 않은 경우).

  arr[0]=Hello
  arr[1]=World

하지만 배열 항목을 참조하려고 하면 약간 보기 흉해집니다.

echo ${arr[0]} ${arr[1]}

매뉴얼 페이지에서 인용하려면: 경로 이름 확장과의 충돌을 피하기 위해 중괄호가 필요합니다.

또한 다음과 같은 펑키한 구성을 사용할 수 있습니다.

  ${arr[*]}         # All of the items in the array
  ${!arr[*]}        # All of the indexes in the array
  ${#arr[*]}        # Number of items in the array
  ${#arr[0]}        # Length of item zero

${!arr[*]}는 bash에 비교적 새로 추가된 것으로 원래 배열 구현의 일부가 아니었습니다.

다음 예에서는 몇 가지 간단한 배열 사용법을 보여줍니다(특정 인덱스를 할당하려면 "[index]=value" 할당에 유의하세요).

#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"

echo "Array items:"
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:"
for index in ${!array[*]}
do
    printf "   %d\n" $index
done
echo "Array items and indexes:"
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done

이를 실행하면 다음과 같은 출력이 생성됩니다. 배열 크기: 5 배열 항목:

   one
   two
   three
   four
   five

배열 인덱스:

   0
   1
   2
   3
   5

배열 항목 및 인덱스:

   0: one
   1: two
   2: three
   3: four
   5: five

" 대신 "@" 기호를 사용할 수 있습니다." ${arr[와 같은 구문에서]}, 인용된 문자열 내의 배열 항목으로 확장하는 경우를 제외하면 결과는 동일합니다. 이 경우 동작은 "$를 확장할 때와 동일합니다." 및 "$@"는 인용된 문자열 내에서 사용됩니다: "${arr[]}"는 모든 항목을 단일 단어로 반환하는 반면, "${arr[@]}"는 각 항목을 별도의 단어로 반환합니다.

bash 배열에 대한 더 많은 정보는 다음에서 찾을 수 있습니다.http://www.linuxjournal.com/content/bash-arrays

파일을 배열에 로드하려면 X 변수를 사용하여 배열에 인덱스를 추가하거나 루프 내에서 사용자 정의 인덱스를 가져올 수 있습니다.

#!/bin/sh

files="`cat $1`"

for x in $lines
    echo "$x"
done

답변2

awk -F';' '
  NR == FNR {a[$1] = $0; next}
  {print a[$0]; delete a[$0]}
  END {for (l in a) print a[l]}' file1 file2

관련 정보