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

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

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

파일 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

관련 정보