【问题标题】:using awk to append fields of one file to another使用 awk 将一个文件的字段附加到另一个文件
【发布时间】:2014-10-27 05:35:10
【问题描述】:

我正在尝试将一个文件(数据库)的每一行附加到另一个文件的末尾,以便使用 awk 在 html 表中使用。我在“}”处不断收到语法错误,不知道为什么。

cat cds.db | sort -t':' -k4 | awk -F':' '{for i in $(cat cds.db) do echo "<tr><td align=left> $2 </td><td align=left> $1 </td><td align=right> $4 </td></tr>" }' >>cds.html done

【问题讨论】:

  • awk 代码确实有几个问题。您是否会显示来自cds.db 的几行以及您希望这些行的输出看起来像什么?
  • 这是文件中的几行:Morrison, Van:Astral Weeks:Warner Bros:1968 \n McKennet, Loreena:Book of Secrets:Warner Bros:1997\n Indigo Girls:Shaming of the Sun:Epic:1997 \n 我希望输出是标题、艺术家、年份。我对 awk 很陌生,我知道 awk 对语法非常讲究。

标签: unix awk


【解决方案1】:

考虑这个输入文件:

$ cat cds.db
Morrison, Van:Astral Weeks:Warner Bros:1968
McKennet, Loreena:Book of Secrets:Warner Bros:1997
Indigo Girls:Shaming of the Sun:Epic:1997

按年份排序并重新排序字段:

$ sort -t: -k4 cds.db | awk -F: '{print $2":"$1":"$4 }' 
Astral Weeks:Morrison, Van:1968
Shaming of the Sun:Indigo Girls:1997
Book of Secrets:McKennet, Loreena:1997

注意事项:

  • 冒号 (:) 不是 shell 活动的。因此,对它没有特殊的报价要求。

  • awk 隐式循环遍历输入的每一行。因此,无需使用for 循环来读取行。

  • 对于输出,awkprintprintf 语句。它没有echo

  • 上面的脚本假定您需要一个冒号作为输出的字段分隔符。如果没有,可以调整print 语句。

使用输出字段分隔符的替代方法

如果print 的参数由逗号分隔,则在打印时,awk 在它们之间插入输出字段分隔符OFS。以下使用这种方法并生成与上面相同的输出:

sort -t: -k4 cds.db | awk -F: -v OFS=: '{print $2,$1,$4 }'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 2019-08-15
    • 2015-08-22
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多