Bash逐行读取文件并使用awk

时间:2014-01-15 16:06:53

标签: bash awk

我在用户名:名字:姓氏:电话号码格式中有一个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

您能否告诉我应该修改哪些内容以便一次打印每条记录(文件行)?

谢谢!

2 个答案:

答案 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通过循环遍历每个项目来解释“食谱”:
    • digit i - 打印 i 字段,基于0
    • “BR” - 打印换行符
    • 其他任何东西 - 用作标签:打印它后面的“:”
  • 将每一行放在数组fields中,使用:作为字段分隔符

如果您不喜欢配方格式,您可以更改脚本以使其像这样工作:

citire uid 1 cn 3 2 sn 2 tel 4