사용자 정의 패턴을 사용하여 정렬

사용자 정의 패턴을 사용하여 정렬

사용자 정의 모드를 사용하여 파일 내용을 출력하는 방법이 있습니까?

myfile예를 들어 다음 내용이 포함된 파일이 있습니다 .

a
d
b
c

..다음 패턴을 사용하여 정렬하는 방법: 먼저 "b"로 시작하는 줄을 인쇄한 다음 "d"로 시작하는 줄을 인쇄한 다음 일반 알파벳 순서로 줄을 인쇄하므로 예상되는 출력은 다음과 같습니다.

b
d
a
c

답변1

데이터를 용량을 초과하여 정렬해야 하는 경우 sort일반적인 방법은 데이터를 전처리하고 앞에 정렬 키를 추가한 다음 정렬하고 마지막으로 중복 정렬 키를 삭제하는 것입니다. 예를 들어, 여기에서 0줄이 로 시작하면 ba를 추가하고, 1줄이 로 시작하면 da를 추가하고, 2그렇지 않으면 a를 추가합니다.

sed -e 's/^b/0&/' -e t -e 's/^d/1&/' -e 't' -e 's/^/2/' |
sort |
sed 's/^.//'

이렇게 하면 모든 b및 행이 d정렬됩니다 . 행을 원래 순서로 유지하려면 가장 간단한 방법은 다음과 같습니다.정렬되지 않은 행을 분할합니다.. 그러나 원래 행을 정렬 키로 변환할 수 있지만 nl여기서는 더 복잡합니다. ( \tsed가 이 구문을 이해하지 못하는 경우 전체 탭을 리터럴 탭으로 대체하세요.)

nl -ba -nln |
sed 's/^[0-9]* *\t\([bd]\)/\1\t&/; t; s/^[0-9]* *\t/z\t0\t/' |
sort -k1,1 -k2,2n |
sed 's/^[^\t]*\t[^\t]*\t//'

또는 사용자 정의 정렬 기능을 쉽게 지정할 수 있는 Perl, Python 또는 Ruby와 같은 언어를 사용하십시오.

perl -e 'print sort {($b =~ /^[bd]/) - ($a =~ /^[bd]/) ||
                     $a cmp $b} <>'
python -c 'import sys; sys.stdout.write(sorted(sys.stdin.readlines(), key=lambda s: (0 if s[0]=="b" else 1 if s[0]=="d" else 2), s))'

b또는 합계 행의 원래 순서를 유지하려는 경우 d:

perl -e 'while (<>) {push @{/^b/ ? \@b : /^d/ ? \@d : \@other}, $_}
         print @b, @d, sort @other'
python -c 'import sys
b = []; d = []; other = []
for line in sys.stdin.readlines():
    if line[0]=="b": b += line
    elif line[0]=="d": d += line
    else: other += line
other.sort()
sys.stdout.writelines(b); sys.stdout.writelines(d); sys.stdout.writelines(other)'

답변2

단순한 명령 이상의 기능을 사용해야 합니다 sort. 행이 먼저 grep정렬 b되고 그 다음 d행이 b정렬되며 끝에 또는 기호가 없는 항목이 모두 정렬됩니다.d

grep '^b' myfile > outfile
grep '^d' myfile >> outfile
grep -v '^b' myfile | grep -v '^d' | sort >> outfile
cat outfile

결과는 다음과 같습니다.

b
d
a
c

이것은 행이 "pattern" 으로 시작한다고 가정합니다 b.d모두패턴이나 한 줄 내의 다른 내용에서는 캐럿( ^) 을 생략할 수 있습니다.

한 줄에 해당하는 내용은 다음과 같습니다.

(grep '^b' myfile ; grep '^d' myfile ; grep -v '^b' myfile | grep -v '^d' | sort)

답변3

이 문제를 해결하는 한 가지 방법 awk은 다음과 같습니다.

sort myfile | awk '$0 ~ /^b/ || $0 ~ /^d/ {print} $0 !~ /^b/ && $0 !~ /^d/ { a[f++] = $0 } END { for (word = 0; word < f; word++) { print a[word] } }'

답변4

grep 솔루션 외에도 파일 기록이 있고 명령을 유지하려는 경우 다음을 사용할 수 있습니다.매개변수당신이 전화하는 곳grep. 일부 데이터가 포함된 파일(custom_sort.txt)이 있다고 가정해 보겠습니다.

ccc
aaa
xxx
nnn

그리고 추가 정보가 포함된 정렬된 grep 파일(sorted-data.txt)을 검색하려고 합니다.

aaa info
bbb test
ccc warn
...
mmm test
nnn info
...
xxx warn

간단히 grep하면 다음과 같은 결과가 출력됩니다.

aaa info
ccc warn
nnn info
xxx warn

원본 파일과 같이 데이터를 정렬하려면 다음을 수행해야 합니다.

cat custom_sort.txt | xargs -l1 -I KEY grep KEY sorted-data.txt

출력은 다음과 같습니다:

ccc warn
xxx warn
aaa info
nnn info

관련 정보