有很多关于删除前导空格并使用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和其他替代方法。
答案 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分隔符。我使用变量时遇到了困难。
更简洁的选择是使用替代分隔符。不要与随后的管道混淆。