샘플 파일이 있습니다.
[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
}