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

Bash bourne shell,编辑文件,具有特定的列和行,bash,shell,sh,Bash,Shell,Sh,我正在尝试将当前日期写入文件。 我想把它写到第二行第二列(列之间用“;”分隔) 使用Shell 到目前为止我尝试过的,但没有成功: paste <(echo "$(date)") <(awk -F ";" '{print $2}' file) 编辑“文件”后的示例: 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

我正在尝试将当前日期写入文件。 我想把它写到第二行第二列(列之间用“;”分隔)

使用Shell

到目前为止我尝试过的,但没有成功:

paste <(echo "$(date)") <(awk -F ";" '{print $2}' file)
编辑“文件”后的示例:

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

要将第二行第二列替换为当前日期,请执行以下操作:

$ 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使用
    作为字段分隔符

  • -vd=“$(日期)”

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

  • NR==2{$2=d}

    在第二行,
    NR==2
    ,这告诉awk用变量
    d
    的值替换第二列,
    $2

  • 1

    这是awk打印当前行的简写

  • 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
你能试试这个吗

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

阵列?还有,请读一下怎么做。嗯
这只是为了学校的目的…将结果写回原始文件:
gawk-i inplace-F..
--看看为什么在脚本正文后同时使用
-v
和set of?一种还是另一种风格?@glennjackman我添加了一个GNU
-I in place
示例,尽管我们在推荐它时必须小心,因为仍然有旧版本的GNU awk在使用(例如Ubuntu 14)不支持
-i inplace
@glennjackman我发现我使用的样式使我从左到右阅读代码变得容易。在赋值中使用
d
之前,需要知道它的值,而
OFS
只影响最终输出。但是,你绝对相信其他风格是可能的,其他人可能更喜欢这些其他风格。我在答案的末尾添加了一些显示不同风格的选项。
sed "2s/\(^[^\;]*\;[^\;]*\)/\1\;`date`/" <filename>