我在用户名:名字:姓氏:电话号码格式中有一个sample.txt文件(有几行,我想创建一个脚本,将每一行转换为这种格式:
uid: Username
cn: LastnameFirstname
sn: Firstname
tel:Telephone number
到目前为止,我设法创建了一个citire函数,只有当sample.txt有一行时才能读取和打印OK。
citire () {
uid=$1
l=$2
while read -r line
do
name=$line
if [ -z "$3" ]
then
echo -e "$uid:`echo $name|awk -F ":" '{print $"'$l'"}'`"
else
l2=$3
echo -e "$uid: `echo $name|awk -F ":" '{print $"'$l'" $"'$l2'"}'`"
fi
done < /home/alexandrumohora/teste/sample.txt
}
citire uid 1
citire cn 3 2
citire sn 2
citire tel 4
您能否告诉我应该修改哪些内容以便一次打印每条记录(文件行)?
谢谢!
答案 0 :(得分:5)
所以你基本上想要类似这样的东西没有bash
:
gawk 'BEGIN {FS=":"}
{ print "uid:" $1
print " cn:" $3, $2
print " sn:" $2
print "tel:" $4
}' INPUTFILE
修改:还可以看到我的回答下面的评论,以获得正确的解决方案,还可以归功于他们!
最短的解决方案可能是:
awk -F: { printf "uid: %s\n cn: %s %s\n sn: %s\ntel: %s\n", $1, $3, $2, $3, $4 } INPUTFILE
答案 1 :(得分:1)
我不知道您是否只想以固定格式输出所有记录,或者您希望使用citire
函数配置格式。
这是一个以固定格式输出的简单版本,在您的示例中使用:
#!/bin/bash
data=/home/alexandrumohora/teste/sample.txt
citire() {
while IFS=: read uid sn ln tel; do
echo uid: $uid
echo cn: $ln$sn
echo sn: $sn
echo tel:$tel
done < "$data"
}
citire
这是一个更复杂的版本,其中citire
采用“配方”,使该功能可以使用不同的格式重复使用:
#!/bin/bash
data=/home/alexandrumohora/teste/sample.txt
citire() {
while IFS=: read -a fields; do
for i; do
case $i in
[0-9]) printf %s "${fields[$i]}" ;;
BR) echo ;;
*) printf '%s: ' "$i" ;;
esac
done
done < "$data"
}
citire uid 0 BR cn 2 1 BR sn 1 BR tel 3 BR
说明:
citire
通过循环遍历每个项目来解释“食谱”:
fields
中,使用:
作为字段分隔符如果您不喜欢配方格式,您可以更改脚本以使其像这样工作:
citire uid 1 cn 3 2 sn 2 tel 4