기타 Pyp 댓글

기타 Pyp 댓글

다음과 같은 방식으로 많은 수의 레코드가 포함된 파일이 있습니다.

Name
Address
Phone

이는 파일의 각 레코드 순서입니다. 이제 이 파일을 다른 파일에 복사하고 아래와 같이 순서를 변경하고 싶습니다.

Address
Phone
Name

이를 위해 쉘 스크립트를 어떻게 작성합니까?

답변1

노력하다:

sed -n 'h;n;p;n;G;p' < file.in > file.out

예를 들어:

$ seq 9 | sed -n 'h;n;p;n;G;p'
2
3
1
5
6
4
8
9
7

답변2

귀하의 질문을 올바르게 읽었다면 파일에서 3줄의 시퀀스를 가져오고 각 줄의 첫 번째 줄과 마지막 줄의 순서를 바꾸고 싶습니까? GNU sed를 사용하면 다음과 같은 작업을 수행할 수 있을 것 같습니다.

sed -e :a -e '$!N' -e 's/\(.*\)\n\(.*\)\n\(.*\)$/\2\n\3\n\1/;Ta' file

스왑을 할 수 있을 때까지 라인을 계속 흡수한 다음 다시 시작합니다.

답변3

그리고 awk:

awk '{l=$0;getline;print;getline;print $0"\n"l;}' < file_in > file_out

설명하다:

  1. 현재 레코드를 변수에 저장l

  2. 다음 레코드를 가져오는 데 사용getline

  3. 이 레코드를 인쇄합니다( print인수 없이 호출하면 항상 현재 레코드가 인쇄됩니다).

  4. 다음 레코드를 얻으려면 다시 사용하십시오.getline

  5. 레코드, 개행 문자 및 저장된 첫 번째 레코드를 인쇄합니다.l

  6. 다음 기록은 1부터 시작하세요.

인용하다

답변4

내가 사용하고 싶은 일부 단일 행 변환의 경우pyp("pypyp"로 배포됨)

표시되지 않은 줄

행이 표시되지 않은 경우 다음과 같이 무조건 변환을 수행할 수 있습니다(%3: 0->2 1->0 2->1).

  • $ seq 9 | pyp '[elem for group in zip(lines[1::3],lines[2::3],lines[0::3]) for elem in group]'

더 짧은 예제 출력은 다음과 같습니다.

$ seq 6 | pyp '[elem for group in zip(lines[0::3],lines[2::3],lines[1::3]) for elem in group]'
1
3
2
4
6
5

마크 라인

데이터 설정:

$ pyp -b 'faker.Faker.seed(202418);f=faker.Faker()' \
  'json.dumps(
     [dict(name=f.first_name(),
        address=f.address().replace("\n",", "),
        phone=f.phone_number())
      for i in range(2)])' \
| jq '.[]|to_entries[]|(.key + ": " + .value)' -r \
| tee q202418.data

접두사로 구문 분석하는 것은 레코드만큼 강력하지 않습니다.

$ <q202418.data \
  pyp -b 'f=lambda categ: filter(lambda l: l.startswith(categ), lines)' \
  'names=f("name:");
   addrs=f("address:");
   ps=f("phone:");
   [line for group in zip(addrs, ps, names) for line in group]'

더욱 강력한 여러 줄 레코드 구문 분석에 대한 논의는 다음을 참조하세요. https://stackoverflow.com/questions/13295083/parsing-a-multi-line-data-file-with-python.

기타 Pyp 댓글

pyp 플래그는 --explain무슨 일이 일어나고 있는지 보여주거나 독립형 스크립트로 저장할 수 있도록 도와줍니다.

$ seq 9 | pyp --explain '[elem for group in zip(lines[1::3],lines[2::3],lines[0::3]) for elem in group]'
#!/usr/bin/env python3
import sys
from pyp import pypprint
lines = [x.rstrip('\n') for x in sys.stdin]
output = [elem for group in zip(lines[1::3], lines[2::3], lines[0::3]) for elem in group]
if output is not None:
    pypprint(output)

Pyp는 PYP_CONFIG_FILE.

pyp는 입력 코드에 대해 정적 분석, 일부 AST 변환 및 정리를 수행한 다음 결과를 컴파일 및 실행하거나 를 사용하여 --explainAST를 소스 코드로 다시 구문 분석합니다. 환경에서 패키지를 가져오고 알 수 없거나 정의되지 않은 기호로 인해 조기에 오류가 발생합니다.

다른 사용 예 보기https://pypi.org/project/pypyp/.

관련 정보