목록의 항목 순서 변경

목록의 항목 순서 변경

일반 텍스트 파일이 있습니다. 파일에는 다음과 같은 목록이 포함되어 있습니다.

@"Joe", @"211",
@"Bob Nelson", @"132",
@"Jack Sierra", @"3422",
@"Walt Robert", @"14",

목록에는 계속해서 수천 개의 이름이 포함되어 있습니다... 요소 순서를 전환하고 이 목록을 다음으로 변환해야 합니다.

@"211", @"Joe",
@"132", @"Bob Nelson",
@"3422", @"Jack Sierra",
@"14", @"Walt Robert",

터미널에서 이 작업을 어떻게 수행합니까?

답변1

이는 공백이 포함된 문자열에 대해 작동합니다.

sed 's/\(@"[^"]*"\), \(@"[^"]*"\)/\2, \1/' input.txt

작동 방식:

sed - (s)tream ( ed)itor는 입력의 각 줄에서 (s)ubstosute 명령을 실행
하고 이를 \(@"[^"]*"\), \(@"[^"]*"\).\2, \1

\2두 번째 일치(두 번째 중괄호에서)는 첫 번째 일치(첫 번째 중괄호에서)를 의미
합니다 .\1

중괄호는 이스케이프되어야 하므로 \(및 가 있습니다 \). 내부에서 @문자를 찾은 다음 문자를 찾은 다음 "언제든지 반복되는 [^"]문자와 다른 문자를 찾은 "다음 "문자를 찾습니다.

,그런 다음 쉼표 다음에 공백이 있고 이와 같은 두 번째 그룹이 올 것으로 예상합니다 \2.

답변2

첫 번째 필드, 구분 기호 및 두 번째 필드를 일치시키고 역순으로 인쇄합니다. 큰따옴표 안에 쉼표가 있을 수 없다고 가정합니다.

sed -e 's/\(.*,\)\( \)\(.*,\)/\3\2\1/'

awk는 줄 끝에 쉼표가 있기 때문에 어색합니다. 그럼에도 불구하고 공백을 추가하거나 필드 구분 기호로 쉼표를 / +/바꿀 수 있습니다.

awk -F ', ' '{print $2 " " $1 ","}'

따옴표 안에 쉼표가 있을 수 있는 경우 따옴표 이스케이프 규칙(있는 경우)을 고려하는 방식으로 필드를 일치시켜야 합니다.

관련 정보