我有一个示例.txt文件名:名字:姓氏:电话号码格式的文件(有几行,我想创建一个脚本,将每一行转换为这种格式:
uid: Username
cn: LastnameFirstname
sn: Firstname
tel:Telephone number
到目前为止,我已经设法创建了citire函数,该函数仅在样本.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
你能告诉我我应该修改什么才能让它一次打印每条记录(文件行)吗?
谢谢!
所以你基本上想要这样的东西,它无需bash
gawk 'BEGIN {FS=":"}
{ print "uid:" $1
print " cn:" $3, $2
print " sn:" $2
print "tel:" $4
}' INPUTFILE
编辑:另请参阅我答案下方的评论以获得适当的解决方案,归功于他们!
最短的解决方案可能是:
awk -F: { printf "uid: %sn cn: %s %sn sn: %sntel: %sn", $1, $3, $2, $3, $4 } INPUTFILE
您是只想以固定格式输出所有记录,还是希望该格式可通过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
通过循环访问每个项目来解释"食谱":- 数字 i -- 打印字段 i,从 0 开始
- "BR" -- 打印换行符
- 其他任何东西 - 用作标签:打印它并在它后面加上":"
- 将数组中的每一行放在数组
fields
中,使用:
作为字段分隔符
如果您不喜欢配方格式,您可以更改脚本以使其像这样工作:
citire uid 1 cn 3 2 sn 2 tel 4