Bash awk附加到同一行

时间:2017-12-31 22:52:35

标签: bash awk

有很多关于删除前导空格并使用awk将条目附加到文件中的单个现有行的帖子。我的尝试都没有奏效 - 这里只有我尝试过的许多例子。

假设我有一个名为$ log的文件,只有一行

a:b:c

我要添加第四个条目

awk '{ print $4"d" }' $log | tee -a $log

输出似乎是换行符

`A:B:C:

D`

然而,我希望所有人都在同一条线上;

a:b:c:d

BEGIN { FS = ":" } ; awk '{ print $4"d" }' $log | tee -a $log

或者,这 - 避免换行

awk 'BEGIN { ORS=":" }; { print $4"d" }' $log | tee -a $log

没有变化

`A:B:C:

D`

awk在c:之后放置一个空格,然后将d写入下一行。

编辑:| tee -a $ log似乎是将附加字符串写入文件所必需的。

$ log包含39个变量,是使用awk生成的,没有| tee -a

...奇

将40美元写入单行条目的实际命令

awk '{ print $40"'$imagedir'" }' $log

输出

+ awk '{ print $40"/home/geoland/Asterism-DEVEL/DSO" }' 

/home/geoland/.asterism/log

但这不会写入$ log文件。

如何使用awk将d附加到同一行而不使用前导空格 - 同时查看sed xargs和其他替代方法。

5 个答案:

答案 0 :(得分:0)

使用sed

$ echo a:b:c | sed 's,\(^.*$\),\1:d,'
a:b:c:d

答案 1 :(得分:0)

使用awk

awk '{ print $0":d" }' file

使用sed

sed 's/$/:d/' file

仅使用bash

while IFS= read -r line; do 
    echo "$line:d"
done < file

答案 2 :(得分:0)

谢谢大家......这是我选择的解决方案。我还需要将整行写入永久日志文件,因为日志文件会在每个新流程实例中被覆盖。

我将进一步研究awk解决方案。

logname=$imagedir/log_$name

while IFS=: read -r line; do 
    echo "$line$imagedir"
done < $log | tee $logname

这将$ imagedir直接放在最后一个IFS':'分隔符

后面

可能还有改进的空间。

答案 3 :(得分:0)

我也不完全确定你在这里要做什么。

您的命令行awk '{ print $4"d" }' $log | tee -a $log在很多方面都存在问题。

首先,您的awk脚本尝试打印第4个字段,该字段为空。除非您另有说明,否则字段由空格分隔,字符串a:b:c没有空格。所以.. awk打印“d”。并且tee -a会附加到您现有的日志文件中,因此您看到的是原始数据以及awk打印的d。这完全是预期的。

其次,似乎tee附加到awk正在阅读的同一文件中。这不会产生无限循环,因为awk应该在文件打开后的最后一个字节之后停止读取输入文件,但它确实意味着你可能在那里重复数据。

除了一些语法错误之外,你的其他尝试都遭受了同样的假设:$4意味着它没有。

以下awk片段将输入和输出字段分隔符设置为:,然后将第4个字段设置为“d”,然后打印该行。

$ echo "a:b:c" | awk 'BEGIN{FS=OFS=":"} {$4="d"} 1'
a:b:c:d

这就是你想要的吗?

如果确实需要将此数据附加到现有日志文件,则可以使用tee -a或简单>>重定向来执行此操作。请记住,awk只会在运行时看到文件的内容,并且通过追加,您不会替换行。

另一件事。如果您实际上希望在awk中使用shell变量$imagedir的内容,则应该传入变量而不是退出引号。例如:

$ echo "a:b:c" | awk -v d="foo/bar" 'BEGIN{FS=OFS=":"} {$4=d} 1'
a:b:c:foo/bar

答案 4 :(得分:0)

sed "s|$|$imagedir|" file | tee newfile

这就是诀窍。读取'file'并将'file'的内容写入替换为'new file',以便在使用辅助独立进程时读取映像目录。

因为变量是一个目录,其中有几个/这些需要被转义,所以不要解释为sed分隔符。我使用变量时遇到了困难。

更简洁的选择是使用替代分隔符。不要与随后的管道混淆。