Bash 逐行读取文件并使用 awk



我有一个示例.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

相关内容

  • 没有找到相关文章

最新更新