이 문제에 대한 도움을 주셔서 감사합니다. 다음 형식의 텍스트 파일이 있습니다.
이름은 항상 3자, 직업은 7자, 급여는 5자라고 가정해도 무방합니다. 변수는 매개변수가 아닌 사용자 입력에서 나옵니다.
BobJanitor20000
TedBuilder30000
NedFighter25000
KitTeacher40000
직업이나 급여를 표시할지 사용자에게 이름과 다른 입력을 입력하도록 요청합니다.
사용자가 "Ted"를 입력하고 급여를 선택하면 출력은 다음과 같아야 합니다.
Ted 30000
프로그램은 부분적인 이름 일치도 고려해야 하며 "ed" 및 급여가 출력되어야 합니다.
Ted 30000
Ned 25000
나는 관련 라인을 알고 cut
있고 grep
제공할 수 있지만 원하는 출력을 어떻게 생성합니까?
답변1
$ grep -F ed file|fold -w 5|fold -w 3|grep -E '^[[:upper:]]..|^[0-9]'|paste -sd ' \0\n' -
Ted 30000
Ned 25000
또는:
$ cut -c 1-3,11- file | grep -F ed | fold -w 3 | paste -sd ' \0\n' -
Ted 30000
Ned 25000
또는 (GNU 가정 grep
):
$ grep -oE '^.{3}|.{5}$' file | paste -sd ' \n' - | grep -F ed
Ted 30000
Ned 25000
다음을 수행할 수도 있습니다(셸에 프로세스 대체 지원이 있다고 가정).
separate() {
fold -w 1 -- "$@" |
paste -sd '\0\0 \0\0\0\0\0\0 \0\0\0\0\n' - |
sort -k 1,1
}
join <(separate file | cut -d ' ' -f 1 | grep -F ed
) <(separate file) | cut -d ' ' -f 1,3
답변2
이름 검색 스크립트입니다. 나는여기 문서(일명 heredoc)은 외부 파일 대신 목록을 while 루프에 전달하여 더 쉽게 읽을 수 있도록 해당 파일 내에 모두 포함되도록 합니다. 필요에 따라 연장할 수 있습니다.
man bash
에 대해 읽다내장 명령, (굵은 글씨로 표시된 내용을 매뉴얼에서 검색하세요) 제가 사용하고 있는 것은,
- 하위 문자열 확장라인의 다양한 부분 얻기
- 정규식일치하는 항목을 찾았습니다. =~
- [[...]]는 다음을 반환합니다.가정 어구값(0 또는 1)은 내부 표현식에 따라 다릅니다.
스크립트는 다음과 같습니다.
read -p "Input Name: " SearchName
while read line
do
Name=${line:0:3}
Job=${line:3:7}
Salary=${line:10:5}
[[ $Name =~ $SearchName ]] && echo $Name $Salary
done << "end--"
BobJanitor20000
TedBuilder30000
NedFighter25000
end--
user@machine:~/tmp$ bash manipvar.sh
Input Name: ed
Ted 30000
Ned 25000
user@machine:~/tmp$
답변3
구분은 대문자를 기준으로 한다고 가정합니다.
SED와 함께
이름 + 급여
sed -e "/${NamePart}.*[A-Z].*/ !d" -e 's/\([A-Z][a-z]*\)[A-Z][a-z]*\([0-9]*\)/\1 \2/' YourData.file
이름 + 직업
sed -e "/${NamePart}.*[A-Z].*/ !d" -e 's/\([A-Z][a-z]*\)\([A-Z][a-z]*\)[0-9]*/\1 \2/' YourData.file
답변4
이것은 나에게 효과적입니다
$ echo `grep -oe '^...\|[0-9]\{5\}' filename` | grep -oe '.\{9,10\}$\?' | grep ed
Ted 30000
Ned 25000