리눅스에서 문자열 재정렬하기

리눅스에서 문자열 재정렬하기

명령줄을 사용하여 줄을 어떻게 바꿀 수 있나요?
예를 들어 다음 줄이 있습니다.

    Acct-Status-Type = Start
    User-Name = "37XXXXXXX"
    Event-Timestamp = "Apr 12 2013 15:56:55 AMT"

순서를 다음과 같이 바꿔야 합니다.

    Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
    User-Name = "37XXXXXXX"
    Acct-Status-Type = Start

sed, awk, perl 등 하나의 명령으로 이 작업을 수행해야 합니다.

답변1

이 작업을 어디서, 얼마나 자주, 왜 하는지 등에 따라 다르지만 스크립트에 넣어도 문제가 되지 않습니다.

어쨌든 정의된 순서로 인쇄하려면 이와 같은 작업을 수행할 수 있습니다. 이 접근 방식을 사용하면 선택한 일부만 인쇄하도록 선택할 수도 있습니다. 예를 들어 1과 3만:

짧막 한 농담:

awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
 for(i in a)printf("%s\n",ln[a[i]]);}' \
 sample.txt

또는 더 읽기 쉽습니다.

/^/{
    ln[NR] = $0
}
END{
    split(order,a,"");

    for(i in a)
        printf("%s\n",ln[a[i]]);
}

분할의 경우 9줄 이상이면 구분 기호를 추가할 수 있습니다.

예:

split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...

또는 여러 항목을 지원하려면 다음을 수행하세요.

if (order ~ /-/)       split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/)   split(order, a, ":"); # order has ":", split
else                   split(order, a, "");  # none presume numbers split all

다음과 같이 줄을 일치시키도록 선택할 수도 있습니다.

BEGIN {
    i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
    if (order ~ /-/)  split(order, a, "-");
    else if (order ~ /\./) split(order, a, ".");
    else if (order ~/:/) split(order, a, ":");
    else split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}

편집하다:

마지막 샘플에서는 이것이 더 나을 것입니다. (또한 업데이트되었습니다.나뉘다):

/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
    if (split(order, a, "-|:|,| |\\.") == 1) # Space require quoting of arg.
        split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}

답변2

Python과 파일 이름을 프로그램에 대한 명령줄 매개변수로 사용:

import sys
with open(sys.argv[1]) as fp:
    for line in fp.readlines()[::-1]:
        sys.stdout.write(line)

또는 해당 파일에 다시 쓰십시오.

import sys
with open(sys.argv[1]) as fp:
    lines = fp.readlines()
with open(sys.argv[1], 'w') as fp:
    for line in lines[::-1]:
        fp.write(line)

또는 stdin에서 stdout으로의 필터로:

lines = sys.stdin.readlines()
for line in lines[::-1]:
    sys.stdout.write(line)

관련 정보