![在分隔符之前添加模式](https://linux22.com/image/142679/%E5%9C%A8%E5%88%86%E9%9A%94%E7%AC%A6%E4%B9%8B%E5%89%8D%E6%B7%BB%E5%8A%A0%E6%A8%A1%E5%BC%8F.png)
我正在寻找在分隔符之前添加模式的命令。
我的刺:
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/
。