Bash awk附加到同一行

问题描述 投票:-2回答:5

有很多关于删除前导空格并使用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生成的,没有|发球台

奇...

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

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

产量

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

/home/geoland/.asterism/log

但这不会写入$ log文件。

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

bash awk
5个回答
0
投票

使用awk

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

使用sed

sed 's/$/:d/' file

仅使用bash

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

0
投票

使用sed

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

0
投票

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

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

logname=$imagedir/log_$name

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

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

可能还有改进的空间。


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

0
投票
sed "s|$|$imagedir|" file | tee newfile

这样就可以了。读取'file'并将'file'的内容写入'new file',以便在使用辅助独立进程时读取映像目录。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.