Нужно взять 4-е слово строки и скопировать его в начало строки (sed awk)

Нужно взять 4-е слово строки и скопировать его в начало строки (sed awk)

У меня есть файл с 5 миллионами строк:

xx ss ss "abcde"

Мне нужно взять "abcde"и скопировать его в начало каждой строки:

"abcde" xx ss ss "abcde"

Строка "abcde"меняется в каждой строке, поэтому это не конкретное слово, а всегда четвертое слово в каждой строке.

решение1

Альтернативный awk:

awk '{print $4,$0}' file

Тестирование:

$ cat file7
abc def ghi nop
klm one two three
four five six nine

$ awk '{print $4,$0}' file7
nop abc def ghi nop
three klm one two three
nine four five six nine

решение2

При sedусловии, что столбцы разделены несколькими пробелами и могут быть дополнительные столбцы:

sed 's/\([^ ]* *\)\{3\}\([^ ]*\)/\2 &/'

Шаблон соответствует трем повторяющимся столбцам, идентифицированным как не-пробелы, за которыми следуют пробелы, за которыми следует еще один столбец, указанный как \2в строке замены. Он &помещает все совпадение в замену, поэтому четвертый столбец вставляется перед всем остатком строки.

Обратите внимание, что этот метод будет работать с более чем четырьмя столбцами, но не сработает, если четвертый столбец отсутствует.

То же самое, если доступны расширенные регулярные выражения (FreeBSD или GNU sed):

sed -E 's/([^ ]* *){3}([^ ]*)/\2 &/'

решение3

Здесь есть лучшие ответы, но вот цикл for in, который тоже работает:

IFS=$'\n'; for i in $(cat file); do var=$(echo $i | awk '{print $4}')  ; sed -i "s/.*$var/$var &/g" file ;done

решение4

Мы размещаем 4-е поле $F[3]вместе с разделителем списка $"(который по умолчанию равен space) в начале записи/строки. Опция -pбудет autoprintзапись.

perl -pale 's/^/$F[3]$"/' yourfile

С помощью команды sed мы сохраняем копию оригинала и ограждаем 4-е поле. Затем мы удаляем начальную часть. И восстанавливаем оригинал, добавляя его к пространству шаблона, которое теперь содержит 4-е поле.

sed -e '
   /\n/!h
   //!s/\S\+/\n&\n/4
   /\n.*\n/D
   s/\n.*//;G;s/\n/ /
' yourfile

Связанный контент