순서가 잘못된 파일이 있습니다. 두 번째 파일을 사용하여 재정렬하고 싶습니다.
파일 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