区切り文字の前にパターンを追加するコマンドを探しています。
私のとげ:
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
コードは最初の2つのフィールドをprintf
フォーマットテンプレートに挿入します。 3番目のフィールドが利用可能な場合、オペレーティングシステムの部分は同じ行に出力されます。その後、行は改行文字で終わります。
答え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
また、例に示すように、スペースを印刷し、3番目の単語の最初の文字を大文字に変換します。例:
$ ./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/
。