заменить слова в двух столбцах из последней строки - PullRequest
0 голосов
/ 05 марта 2019

У меня есть файл, и каждый столбец имеет между другим столбцом хотя бы один пробел.

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 ]

1 голос
/ 05 марта 2019

Не могли бы вы попробовать следующее (честное предупреждение: протестировано только с приведенным примером)

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
0 голосов
/ 05 марта 2019

Вроде то немного, так что ...
Ручной код - вы можете экстраполировать на что-то программное.

$: 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 задачу , и просто перепишите свой первоначальный вопрос, чтобы сказать, что вы пытаетесь выполнить.

0 голосов
/ 05 марта 2019

это не будет так долго, я уверен, что оно всегда будет короче, чем другие строки в этом столбце.

С комментарием ОП эта помощь gawk должна быть одинарной (требуется gawk):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...