我有一个文件,每一列之间在另一列之间至少有一个空格。
abc dogdogdogdog 1.0
abc cat 2.4
现在我想加倍最后一行并更改第二列和第三列,但空格布局应保持不变。
结果:
abc dogdogdogdog 1.0
abc cat 2.4
abc elephant mystring
该怎么做? 现在我正在考虑阅读最后一行,但是我不知道如何将变量传递给awk,因为在awk中,我认为只更改某些列会很容易。
line=$(tail -n 1 $file)
答案 0 :(得分:1)
请您尝试以下操作(警告:仅通过给定示例进行测试)
awk -v line="abc elephant my_string" '
BEGIN{
split(line,array," ")
}
match($0,/ .* +/) && FNR==1{
val=substr($0,RSTART,RLENGTH)
sub(/[a-zA-Z]+/," ",val)
}
1;
END{
print array[1],array[2],substr(val,length(array[2]+1)),array[3]
}' Input_file
答案 1 :(得分:0)
它不会那么长,我敢肯定它总是短于该列中的其他字符串。
在OP的评论下,这种怪异的单线飞机应该有所帮助(需要怪异的东西):
awk '7;END{n=gensub(/\S+(\s+)\S+$/,"new\\1mystring","g");print n}' file
以给出的示例为例:
kent$ cat f
abc dogdogdogdog 1.0
abc cat 2.4
kent$ awk '7;END{n=gensub(/\S+(\s+)\S+$/,"new\\1mystring","g");print n}' f
abc dogdogdogdog 1.0
abc cat 2.4
abc new mystring
答案 2 :(得分:0)
金达稀疏,所以...
手动代码-您可以外推到编程方式。
$: cat 3col
abc dogdogdogdog 1.0
abc cat 2.4
$: read c1 x <<< $( tail -1 3col ) # read 1st column, throw the rest away
$: printf "%-4s%-18s%s\n" $c1 elephant mystring >> 3col # append col 1 and new values
$: $: cat 3col
abc dogdogdogdog 1.0
abc cat 2.4
abc elephant mystring
如果您想要一行-
printf "%-4s%-18s%-3s\n" $( sed -n '${s/ .*//;p;}' 3col ) elephant mystring >> 3col
sed
仅打印最后一行的第一列,并丢弃其他所有内容。
请注意,从技术上讲,这不会对最后两列进行更改-它保留第一列,并将其余列替换为您指定的文字。
如果这不能满足您的需求,请考虑您可能是在假装XY Problem,然后重写原始问题以说明您要完成的工作。