ユーザーが文字列形式で従業員の詳細を入力し、入力文字列に表示された従業員の詳細と同じ順序で前の3年間の従業員を出力に表示したい場合。たとえば、入力文字列は次のようになります。
"EMP101:Jack:CA:[email protected]:10#EMP102:Jill:Doctor:[email protected]:5#EMP103:Russell:Engineer:[email protected]:25#EMP104:Monica:Teacher:[email protected]:4#EMP105:John:Mangaer:[email protected]:8"
出力文字列:たとえば、入力文字列は次のようになります。
"Jack:CA:10#Russell:Engineer:25#John:Mangaer:8"
誰でもシェルスクリプトでこれを達成する方法を教えてもらえますか?
答え1
awk
sort
、および次head
の組み合わせを使用できますpaste
。
awk 'BEGIN{RS="#"; OFS=FS=":"} {gsub(/"\n$/,"",$5); print NR,$2,$3,$5}' file \
| sort -t':' -k4nr \
| head -n3 \
| sort -n \
| cut -d: -f2-\
| paste -sd'#'
出力:
Jack:CA:10#Russell:Engineer:25#John:Mangaer:8
RS
デフォルトは改行ですが、レコードは次のように表示される「レコード区切り」です。#
FS
:
データに使用される「フィールド区切り記号」です。#
asを使用すると、RS
最後のレコードの最後のフィールドの末尾に二重引用符と改行文字が含まれ、を使用してそれらを削除しますgsub
。| sed 's/.*/"\0"/'
引用符を含む正確な出力を得るために追加できます。
答え2
echo "EMP101:Jack:CA:[email protected]:10#EMP102:Jill:Doctor:[email protected]:5#EMP103:Russell:Engineer:[email protected]:25#EMP104:Monica:Teacher:[email protected]:4#EMP105:John:Mangaer:[email protected]:8" \
| awk -F '#' 'BEGIN {OFS = "\n"} {$1 = $1; print}' \
| sort -k 5 -n -r -t : \
| head -n 3 \
| sort -k 1 -t : \
| awk -F : 'BEGIN {OFS = ":"} {print $2, $3, $5}' \
| paste -d '#' -s
結果:
Jack:CA:10#Russell:Engineer:25#John:Mangaer:8
最初のフィールドに基づいて並べ替えます。