Bash awk追加到同一行

Bash awk追加到同一行,bash,awk,Bash,Awk,关于删除前导空格和使用awk将条目附加到文件中现有的一行,有很多帖子。我所有的尝试都不起作用——这里只有三个我尝试过的例子 假设我有一个名为$log的文件,只有一行 a:b:c 我想添加第四个条目 awk'{print$4“d”}'$log | tee-a$log 输出似乎是一条新线 `a:b:c: d` 然而,我希望所有人都在同一条线上 a:b:c:d 试一试 或者,这-避免一个新的线路 awk 'BEGIN { ORS=":" }; { print $4"d" }' $log | tee -

关于删除前导空格和使用awk将条目附加到文件中现有的一行,有很多帖子。我所有的尝试都不起作用——这里只有三个我尝试过的例子

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

a:b:c

我想添加第四个条目

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

输出似乎是一条新线

`a:b:c:

d`

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

a:b:c:d

试一试

或者,这-避免一个新的线路

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

`a:b:c:

d`

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

编辑:| tee-似乎需要$log将附加字符串写入文件

$log包含39个变量,使用不带| tee-a的awk生成

奇怪的

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

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

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

/home/geoland/.asterism/log
但这不会写入$log文件


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

使用
sed

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

使用:

仅使用:

而IFS=read-r行;做
回显“$line:d”
完成<文件

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

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

logname=$imagedir/log_$name

while IFS=: read -r line; do 
    echo "$line$imagedir"
done < $log | tee $logname
logname=$imagedir/log\uName
而IFS=:read-r行;做
echo“$line$imagedir”
完成<$log | T$logname
这将$imagedir直接放在最后一个IFS“:”分隔符后面


可能还有改进的余地

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

您的命令行,
awk'{print$4“d”}'$log | tee-a$log
在许多方面存在问题

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

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

除了一些语法错误之外,您的其他尝试都受到相同的假设的影响,即
$4
表示它没有的意思

下面的awk代码段将输入和输出字段分隔符设置为
,然后将第四个字段设置为“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
这就成功了。读取“文件”并将替换后的“文件”内容写入“新文件”,以便在使用辅助独立进程时读取映像目录

由于该变量是一个包含多个/的目录,因此需要对其进行转义,以免将其解释为sed分隔符。我在使用变量时遇到了困难


一个更简洁的选择是使用另一个分隔符。不要与下面的管道混淆。

不是
awk
而是
tee-a
添加了一条新线。将管道去掉到
tee-a$log
中,您可能会更好地理解awk,但是您发布的命令中没有一个可以生成您所说的输出。如果需要,您的问题是用实际输出显示实际命令您需要帮助调试实际执行的任何命令。请注意,
$4
为空;看起来您应该使用
print$0:d“
,但是
print
添加了一个换行符,所以您可能需要
printf”%s:d“,$0
。然后
tee-a
也很奇怪;它将在文件末尾添加
a:b:c:d
。文件末尾真的没有换行符吗?或者在文件的末尾是否有换行符会有关系吗?我已经简化了发布的脚本。但是,这些命令将“d”放在第2行(gedit,行号),而不是紧跟在第1行最后一个条目的后面。我会找到一种不让人们淹没在大量细节中的方式来发布。谢谢。我稍微支持bash解决方案modified@GeorgeC像您这样设置
IFS
实际上不会有太大变化:)还要注意的是
bash
解决方案是最慢的,而
awk
sed
是大文件的首选解决方案。谢谢。我将使用这些命令,更好地了解它们的功能。速度不是问题,awk和sed需要我做更多的研究。对这两个都不满意。如果能听到有人投反对票的原因,那就太好了。到底出了什么问题?我通常坐在问题上直到找到解决方案。在这一次,可能是沮丧的低谷,我问了这个问题,没有应用第一个策略。这些回答非常有帮助。。。我做了这项研究,但没有任何意义……。为什么不干脆
sed's/$/:d/'
?谢谢。bash脚本运行一系列图像处理任务。用户
while IFS= read -r line; do 
    echo "$line:d"
done < file
logname=$imagedir/log_$name

while IFS=: read -r line; do 
    echo "$line$imagedir"
done < $log | tee $logname
$ echo "a:b:c" | awk 'BEGIN{FS=OFS=":"} {$4="d"} 1'
a:b:c:d
$ echo "a:b:c" | awk -v d="foo/bar" 'BEGIN{FS=OFS=":"} {$4=d} 1'
a:b:c:foo/bar
sed "s|$|$imagedir|" file | tee newfile