다음과 같은 텍스트 파일이 있습니다.
Name1 OpenFin
Name2 Chrome
Name3 OpenFin
Name4 Chrome
Name5 OpenFin
Name6 OpenFin
OpenFin
모든 행이 먼저 나온 다음 모든 행이 오는 방식으로 정렬하고 싶습니다.Chrome
이것이 내가 지금까지 가지고 있는 것입니다:
grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt
답변1
귀하의 요청을 직접 번역:
모든 스트립이 포함된 행이
OpenFin
먼저 표시된 다음 모든 스트립이 포함된 행이 나타납니다.Chrome
...어느 것이 먼저인지 알지 못한 채:
{ grep -F OpenFin LoginExcInternal.txt; grep -F Chrome LoginExcInternal.txt; } > test.txt
또한 원본 파일에 나타난 순서대로 줄을 유지합니다( sort
전체 줄이 정렬되는 것을 방지하기 위해 링을 통과할 필요가 없습니다).
답변2
주문
grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt
Chrome
행의 아무 곳에나 문자열을 포함하는 행만 원시 데이터에서 생성됩니다 . 이는 파이프라인의 오른쪽이 파이프라인의 첫 번째 결과를 전혀 처리하지 않기 때문입니다 grep
(단순히 삭제됨).
grep
읽을 파일 이름이 주어지면 표준 입력 스트림이 처리되지 않습니다. 첫 번째 결과는 표준 입력 스트림에 도착합니다 grep
.
sort -k2r LoginExcInternal.txt >test.txt
두 번째 열의 행이 동일한 열에 포함된 행 뒤에 나타나기를 Chrome
원합니다 . OpenFin
위의 방법은 두 번째 열의 원본 데이터를 사전식 역순으로 정렬하는 방식으로 작동합니다.
Flag는 유틸리티에 두 번째 열의 데이터를 역순( )으로 정렬하도록 -k2r
지시합니다 sort
(또는 세 개 이상의 열이 있는 경우 계속 정렬) r
. 두 행의 두 번째 열에 동일한 값이 있는 경우 전체 행이 정렬 키로 사용됩니다.
~와 일치하다다른 사람두 번째 열의 값은 나머지 행과 함께 정렬되며 출력에도 포함됩니다.
데이터의 원래 순서에 관심이 있고 이를 변경하고 싶지 않고 두 번째 열에 이 두 값이 포함된 행만 추출한다고 가정하면(다른 값은 제외) 두 단계로 수행하십시오. :
awk -v value='OpenFin' '$2 == value' LoginExcInternal.txt >test.txt
awk -v value='Chrome' '$2 == value' LoginExcInternal.txt >>test.txt
awk
이는 변수의 값이 다른 원본 데이터에 동일한 코드를 두 번 적용합니다 value
. 이 코드는 두 번째 열에서만 문자열 비교를 수행하고 지정된 값이 있는 행을 인쇄합니다. 스크립트의 첫 번째 실행은 값을 awk
실행 하고 두 번째 실행은 해당 값에 행을 추가합니다.OpenFin
Chrome
이것은 관련을 피합니다첫 번째데이터 비교 열의 Chrome
경우 첫 번째 열의 값 중 하나라도 또는 이면 문제가 됩니다 OpenFin
. 또한 awk
코드는 문자열 비교를 사용하므로 두 번째 열에 다음 문자열 중 하나가 포함될 수 있는 행이 출력되는 것을 방지합니다.하위 문자열.
답변3
이것은 사용자 "emirn"이 답변한 후 어떤 이유로 삭제되었습니다. 그러나 그들의 반응은 매우 효과적이었습니다.
다음 두 명령을 실행하라는 지시를 받았습니다.
cat LoginExcInternal.txt | grep OpenFin >> test.txt
cat LoginExcInternal.txt | grep Chrome >> test.txt
고마워요 에밀!