У меня есть файл с 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