구분 기호 앞에 패턴을 추가하는 명령을 찾고 있습니다.
내 가시:
1 |Chris|ubuntu
이것이 내 구분 기호 |
이며 이 입력으로 문자열을 생성하고 싶습니다.
산출
1 = ID and Chris = Name and Ubuntu = OS
때로는 내 입력에 값이 2개만 있는 경우도 있습니다. 가정하면 2 | Ram
값은 있고 구분 기호는 없으므로 다음과 같이 인쇄되어야 합니다.
2=ID and Ram=Name
그래서, field1 + "and" + field2 + "and" + field3
. 입력 문자열에서 field3을 사용할 수 없는 경우에 사용됩니다 field1 + "and" + field2
.
답변1
awk -F '|' '
{ printf("%d = ID and %s = Name", $1, $2) }
NF == 3 { printf(" and %s = OS", $3) }
{ printf("\n") }' file
이것은 생성됩니다
1 = ID and Chris = Name and ubuntu = OS
2 = ID and Ram = Name
주어진 데이터에 대해. 이 awk
코드는 처음 두 필드를 printf
형식 템플릿에 삽입합니다. 세 번째 필드를 사용할 수 있는 경우 운영 체제 부분이 동일한 줄에 출력됩니다. 그런 다음 줄은 개행 문자로 끝납니다.
답변2
안녕 밀러http://johnkerl.org/miller/doc, 이 입력 파일에서 시작
1|Chris|ubuntu 2|Ram
그리고 달리는 중
mlr --ifs "|" label ID,Name,OS input.csv
당신은 할 것
ID=1,Name=Chris,OS=ubuntu ID=2,Name=Ram
답변3
존재하다 Bash
:
#!/usr/bin/env bash
if [ "$#" -eq 0 ]
then
printf "Missing argument\n" >&2
exit 1
fi
num_of_delimiters="$(grep -o '|' <<< "$1" | wc -l)"
sting="$(sed -E 's,\s+\|,|,g' <<< "$1")"
sting="$(sed -E 's,\|\s+,|,g' <<< "$sting")"
case "$num_of_delimiters" in
1)
echo "$(cut -d '|' -f1 <<< "$sting")"=ID and "$(cut -d '|' -f2 <<< "$sting")"=Name
;;
2)
echo "$(cut -d '|' -f1 <<< "$sting")" = ID and "$(cut -d '|' -f2 <<< "$sting")" = Name and \
"$(sed 's/./\U&/' <<< "$(cut -d '|' -f3 <<< "$sting")")" = OS
;;
*)
printf "More than 2 delimiters or no delimiters\n" >&2
exit 2
esac
또한 예제에서 볼 수 있듯이 공백을 인쇄하고 세 번째 단어의 첫 글자를 대문자로 변환합니다. 예:
$ ./sting.sh "2 | Ram"
2=ID and Ram=Name
$ ./sting.sh "1 |Chris|ubuntu"
1 = ID and Chris = Name and Ubuntu = OS
오류가 보고되지 않았습니다 https://www.shellcheck.net/
.