다음과 같은 파일이 있다고 가정해 보겠습니다 Dependencies
.
Accounts
Blog
Configuration
Contacts
Entities
Faqs
Forms
Galleries
Geo
Globalization
Logs
Media
Navigation
Notifications
Orders
Payment
Places
Pricing
Products
Sales
Seo
Services
Shipment
Social
Subscriptions
Taxonomy
Ticketing
다양한 방법을 사용하여 이를 반복하고 각 행을 변수로 만들어 작업을 수행할 수 있습니다.
Order
그러나 다음과 같은 이름의 다른 파일이 있습니다 .
Entities
Globalization
Configuration
Accounts
Contacts
Taxonomy
Geo
Media
Places
Products
Services
Orders
Shipment
Payment
Sales
Social
이는 파일에 지정된 순서 Dependencies
에 따라 줄을 로드 해야 함을 의미합니다 . Order
파일에 줄이 없으면 Order
목록의 끝으로 이동하며 순서는 중요하지 않습니다.
dependencies.OrderBy(i => orders.IndexOf(i))
C#에서는 지정된 순서에 따라 종속성을 쉽게 나열할 수 있습니다.
하지만 bash에서 이 작업을 수행하는 방법을 모르겠습니다.
답변1
나는 각 행이 Dependencies
고유하다고 가정합니다. 에 대해서도 마찬가지입니다 Order
. 이 가정은 귀하의 사용 사례에 적합해 보입니다.
다음과 같이 호출하세요.
grep -xFf Dependencies Order; grep -vxFf Order Dependencies
첫 번째는 in 과 in 의 라인을 에서 순서대로 grep
제공합니다 .Dependencies
Order
Order
두 번째는 에 있지만 에는 없는 행을 grep
제공합니다 . 이것은 인쇄되지 않은 첫 번째 줄 입니다 .Dependencies
Order
Dependencies
grep
모든 줄 의 합계가 Dependencies
나타나야 합니다.
Dependencies
에서 또는 에서 반복되는 행이 Order
출력에 여러 번 나타날 수 있지만 에서와 정확히 동일한 개수를 가지지 않을 수 있으므로 고유성 가정이 관련됩니다 Dependencies
. 출력의 개수는 grep
인쇄 위치에 따라 달라집니다.
답변2
사용 awk
:
awk '
FNR == NR {
words[$0]
next
}
($0 in words) {
print
delete words[$0]
}
END {
for (word in words)
print word
}' Dependencies Order
Dependencies
먼저 행을 연관 배열의 키로 읽습니다 . words
그런 다음 행을 읽고 Order
문자열이 words
배열의 키인 경우 이를 인쇄하고 배열에서 키를 제거합니다. 마지막으로 나머지 모든 키가 words
인쇄됩니다.
최종 행 목록이 인쇄되는 순서는 배열의 키가 검색되는 순서에 따라 달라지므로 고정되지 않을 수 있습니다 words
.
시험:
$ awk 'FNR == NR { words[$0]; next } ($0 in words) { print; delete words[$0] } END { for (word in words) print word }' Dependencies Order
Entities
Globalization
Configuration
Accounts
Contacts
Taxonomy
Geo
Media
Places
Products
Services
Orders
Shipment
Payment
Sales
Social
Galleries
Subscriptions
Seo
Faqs
Notifications
Ticketing
Forms
Navigation
Blog
Pricing
Logs
위의 코드는 중복을 제거합니다. 에서 중복 항목을 유지하려면 Dependencies
파일의 각 줄을 본 횟수를 추적한 다음 해당 줄을 본 횟수를 출력하세요.
awk '
FNR == NR {
words[$0]++
next
}
($0 in words) {
while (words[$0]-- > 0) print
delete words[$0]
}
END {
for (word in words)
while (words[word]-- > 0) print word
}' Dependencies Order
답변3
zsh
대신 을 사용하는 경우 bash
다음을 수행하여 동일한 indexof() 메서드를 채택할 수 있습니다.
order=( ${(f)"$(<Order)"} )
dependencies=(
/(Ne['
reply=( ${(f)"$(<Dependencies)"} )
']noe['
REPLY=$order[(ie)$REPLY]
'])
)
그런 다음:
for dep in $dependencies; do
...
done
반복하세요.
noe[code]
수정된 값을 기준으로 glob 확장을 숫자로 정렬하기 위해 glob 한정자를 사용합니다 n
. glob 확장(여기에 적용됨)은 파일 라인을 한정자로 채워서 시드됩니다(이전에 파일 라인으로 배열을 채웠던 것처럼).o
$REPLY
code
/
$reply
Dependencies
$order
Order
e
$order[(ie)$REPLY]
i
xact 와 일치하는 첫 번째 요소의 인덱스 로 확장됩니다 . 일치하는 항목이 없으면 1 + 마지막 인덱스입니다.$order
$REPLY
e
e
${a:*b}
또 다른 방법은 배열 교집합 과 빼기( ${a:|b}
) 연산자 를 사용하는 것입니다 .
order=( ${(f)"$(<Order)"} )
dependencies=( ${(f)"$(<Dependencies)"} )
dependencies=(
${order:*dependencies} # elements or $order that are also in $dependencies
# followed by:
${dependencies:|order} # elements of $dependencies that are not in $order
)