从最后一行替换两列中的单词

时间:2019-03-05 13:45:08

标签: string bash replace

我有一个文件,每一列之间在另一列之间至少有一个空格。

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)

3 个答案:

答案 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,然后重写原始问题以说明您要完成的工作。