bourne shell,编辑文件,具有特定的列和行

时间:2018-03-14 20:14:02

标签: bash shell sh

我正在尝试将当前日期写入文件。 我想将它写入第2行第2列(列由';'分隔)

使用Shell

到目前为止我尝试了什么,不工作:

paste <(echo "$(date)") <(awk -F ";" '{print $2}' file)

有没有明智的方法可以这样做?

示例&#39;文件&#39;:

John;Wed Mar 14 19:41:38 CET 2018;18
Sandra;Mon Mar 14 19:41:38 CET 2018;21
David;Sun Mar 14 19:41:38 CET 2018;25

编辑&#39;文件&#39;后的示例:

John;Wed Mar 14 19:41:38 CET 2018;18
Sandra;The Date When Editing The File With Script;21
David;Sun Mar 14 19:41:38 CET 2018;25

2 个答案:

答案 0 :(得分:3)

用当前日期替换第二行第二列:

$ awk -F";" -v d="$(date)" 'NR==2{$2=d} 1' OFS=";" file
John;Wed Mar 14 19:41:38 CET 2018;18
Sandra;Wed Mar 14 13:28:59 PDT 2018;21
David;Sun Mar 14 19:41:38 CET 2018;25

如何运作

  • -F";"

    这告诉awk使用;作为字段分隔符。

  • -v d="$(date)"

    这定义了包含当前日期的awk变量d

  • NR==2{$2=d}

    在第二行NR==2上,这会告诉awk将第二列$2替换为变量d的值。

  • 1

    这是打印当前行的简写。

  • OFS=";"

    这告诉awk使用;作为输出的字段分隔符。

就地修改文件

使用现代GNU awk就地修改文件:

gawk -i inplace -F";" -v d="$(date)" 'NR==2{$2=d} 1' OFS=";" file

使用macOS或BSD或更旧的GNU awk修改文件:

awk -F";" -v d="$(date)" 'NR==2{$2=d} 1' OFS=";" file >tmp && mv tmp file

风格问题

以下三行都是等效的。你使用哪一个是风格问题:

awk -F";" -v d="$(date)" 'NR==2{$2=d} 1' OFS=";" file
awk -F";" -v d="$(date)" -v OFS=";" 'NR==2{$2=d} 1' file
awk -F";" 'NR==2{$2=d} 1'  d="$(date)" OFS=";" file

答案 1 :(得分:0)

你能试试这个:

sed "2s/\(^[^\;]*\;[^\;]*\)/\1\;`date`/" <filename>