잘라내기 명령, 순서가 유지되지 않습니까?

잘라내기 명령, 순서가 유지되지 않습니까?

샘플 파일이 있습니다.

[root@localhost base_filters]# cat shortlist
2233|charles harris  |g.m.     |sales     |12/12/52| 90000
9876|bill johnson    |director |production|03/12/50|130000
5678|robert dylan    |d.g.m.   |marketing |04/19/43| 85000
2365|john woodcock   |director |personnel |05/11/47|120000
5423|barry wood      |chairman |admin     |08/30/56|160000

,성 뒤에 쉼표가 있도록 파일의 이름을 뒤집고 싶습니다 . 예를 들어 이름은 harris,charles로 읽어야 합니다.

나는 다음 명령을 시도했습니다 :-

[root@localhost base_filters]# tr -s ' ' < shortlist | cut -d\| -f2 | cut -d' ' -f2,1
charles harris
bill johnson
robert dylan
john woodcock
barry wood

성을 먼저 지정하고 싶기 때문에 필드 2를 지정한 다음 1을 지정했지만 작동하지 않는 것 같습니다. 이것에 대한 생각이 있나요?

답변1

이는 를 사용하여 쉽게 수행할 수 있습니다 awk. 먼저 이름을 인쇄한 다음 출력을 다시 awk로 파이프합니다(이번에는 공백을 파일 구분 기호로 사용).

awk -F "|" '{print $2}' extract.txt | awk -F " " '{print $2 "," $1}'

답변2

cut에 대한 매뉴얼 페이지에는 다음과 같이 나와 있습니다.

선택한 입력은 읽은 순서와 동일한 순서로 기록되며 정확히 한 번 기록됩니다.

그래서 자르는 대신 다른 도구를 사용해야 합니다. 예를 들어 sed, awk, Perl, Python 또는 bash입니다.

답변3

다음 함수는 Bash 내장 기능만 사용하여 원하는 작업을 수행합니다(Bash를 사용하려는 경우).

foo () 
{ 
    local filename="$1"

    while IFS='|' read -r pre name suf; do
        l="$pre|${name#* },${name% *}|$suf";
        printf '%s\n' "$l";
    done < "$filename"
}

이것IFS 변수한 번에 각 줄을 읽으려면 | '읽기'로 설정하세요."1"(귀하의 파일)을 세 부분으로 나누고,$이전$이름그리고$suf, IFS 값을 기준으로 합니다.

$앞으로값은 이름 앞의 필드에 설정됩니다.$name바꾸려는 이름 자체(두 번째 필드)로 설정하고$suf나머지 줄입니다.

나는 사용한다매개변수 확장( 에서 Parameter Expansion 을 검색할 수도 있습니다 man bash)$name대지.

"${name#* }"이름은 삭제되고 성은 남습니다.

"${name% *}"성이 제거되고 이름만 남습니다.

용법:foo [/path/to/file.txt]

예제 출력:

nylon100@~$ cat>file.txt
123|first1 last1|foo|bar|date|baz
456|first2 last2|foo|bar|date|baz
789|first3 last3|foo|bar|date|baz

nylon100@~$ foo file.txt
123|last1,first1|foo|bar|date|baz
456|last2,first2|foo|bar|date|baz
789|last3,first3|foo|bar|date|baz

답변4

노력하다:

tr -s ' ' < shortlist | cut -d\| -f2 | tr '\n' ' ' | tac -s' ' | \
  sed -e 's/^[[:space:]]//' -e 's/  /\n/g' | sort

또는 다음과 같은 파일이 많은 경우:

sortnames () {
  tr -s ' ' < $1 | cut -d\| -f2 | tr '\n' ' ' | tac -s' ' | \
    sed -e 's/^[[:space:]]//' -e 's/  /\n/g' | sort
}

관련 정보