Bash逐行读取文件并使用awk

Ale*_*lex 1 bash awk

我在用户名中有一个sample.txt文件:名字:姓氏:电话号码格式(有几行,我想创建一个脚本,将每一行转换为这种格式:

uid: Username
cn: LastnameFirstname
sn: Firstname
tel:Telephone number
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经设法创建了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
Run Code Online (Sandbox Code Playgroud)

你能否告诉我应该修改什么才能让它一次打印每条记录(文件行)?

谢谢!

Zso*_*kai 5

所以你基本上想要这样的东西没有bash:

 gawk 'BEGIN {FS=":"}
       { print "uid:" $1
         print " cn:" $3, $2
         print " sn:" $2
         print "tel:" $4
       }' INPUTFILE
Run Code Online (Sandbox Code Playgroud)

编辑:也看到我的答案下面的评论正确的解决方案,信用他们!

最短的解决方案可能是:

awk -F: { printf "uid: %s\n cn: %s %s\n sn: %s\ntel: %s\n", $1, $3, $2, $3, $4 } INPUTFILE
Run Code Online (Sandbox Code Playgroud)

  • +1,因为你在正确的轨道,但你有字段数错误,"cn"需要3美元2连接,"sn"是2美元.它不需要gawk,任何awk都会这样做,而且你不需要对空间进行硬编码,默认的OFS就足够了,并且cn和sn行中不应该有前导空格.例如`print"cn:",$ 3 $ 2`甚至设置`OFS =":"在BEGIN然后``print"cn",$ 3 $ 2` (3认同)
  • 您也可以使用`awk`s`printf`来简化它:`awk -F:{printf"uid:%s \n cn:%s%s \n sn:%s \ntel:%s \n",$ 1 ,$ 3,$ 2,$ 3,$ 4} INPUTFILE` (3认同)
  • @EdMorton && twalberg:谢谢教我! (2认同)