다음과 같은 방식으로 많은 수의 레코드가 포함된 파일이 있습니다.
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
설명하다:
현재 레코드를 변수에 저장
l
다음 레코드를 가져오는 데 사용
getline
이 레코드를 인쇄합니다(
print
인수 없이 호출하면 항상 현재 레코드가 인쇄됩니다).다음 레코드를 얻으려면 다시 사용하십시오.
getline
레코드, 개행 문자 및 저장된 첫 번째 레코드를 인쇄합니다.
l
다음 기록은 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 변환 및 정리를 수행한 다음 결과를 컴파일 및 실행하거나 를 사용하여 --explain
AST를 소스 코드로 다시 구문 분석합니다. 환경에서 패키지를 가져오고 알 수 없거나 정의되지 않은 기호로 인해 조기에 오류가 발생합니다.
다른 사용 예 보기https://pypi.org/project/pypyp/.