У меня есть файл со многими строками в каждой строке есть много столбцов (полей), разделенных пробелом "" количество столбцов в каждой строке различно Я хочу удалить первые два столбца как?
Как удалить первые два столбца в файле с помощью оболочки (awk, sed, что угодно)
Ответ 1
Вы можете сделать это с помощью cut
:
cut -d " " -f 3- input_filename > output_filename
Объяснение:
-
cut
: вызвать команду cut -
-d " "
: в качестве разделителя используйте единое пространство (cut
использует TAB по умолчанию) -
-f
: укажите поля для сохранения -
3-
: все поля, начинающиеся с поля 3 -
input_filename
: используйте этот файл как вход -
> output_filename
: напишите вывод в этот файл.
В качестве альтернативы вы можете сделать это с помощью awk
:
awk '{$1=""; $2=""; sub(" ", " "); print}' input_filename > output_filename
Объяснение:
-
awk
: вызывать команду awk -
$1=""; $2="";
: установите поле 1 и 2 в пустую строку -
sub(...);
: очистить выходные поля, потому что поля 1 и 2 все равно будут разделены символом "" -
print
: напечатать измененную строку -
input_filename > output_filename
: то же, что и выше.
Ответ 2
Вот один из способов сделать это с Awk, который относительно легко понять:
awk '{print substr($0, index($0, $3))}'
Это простая команда awk без шаблона, поэтому действие внутри {}
выполняется для каждой строки ввода.
Действие состоит в том, чтобы просто напечатать подстроку, начиная с позиции третьего поля.
-
$0
: вся строка ввода -
$3
: 3-е поле -
index(in, find)
: возвращает позициюfind
в строкеin
-
substr(string, start)
: вернуть подстроку, начинающуюся с индексаstart
Если вы хотите использовать другой разделитель, например запятую, вы можете указать его с опцией -F:
awk -F"," '{print substr($0, index($0, $3))}'
Вы также можете использовать это в подмножестве входных строк, указав шаблон перед действием в {}
. Только строки, соответствующие шаблону, будут выполняться.
awk 'pattern{print substr($0, index($0, $3))}'
Где шаблон может быть таким, как:
-
/abcdef/
: использовать регулярное выражение, по умолчанию работает по $0. -
$1 ~ /abcdef/
: работайте в определенном поле. -
$1 == blabla
: используйте сравнение строк -
NR > 1
: использовать запись/номер строки -
NF > 0
: использовать поле/номер столбца
Ответ 3
Спасибо за сообщение вопроса. Я также хотел бы добавить script, который помог мне.
awk '{ $1=""; print $0 }' file
Ответ 4
awk '{$1=$2="";$0=$0;$1=$1}1'
Ввод
a b c d
Выход
c d
Ответ 5
Вы можете использовать sed
:
sed 's/^[^ ][^ ]* [^ ][^ ]* //'
Это ищет строки, начинающиеся с одного или более не-пробелов, пробела, другого набора из одного или нескольких незабитых и еще одного пустого и удаляет сопоставленный материал, например первые два поля. [^ ][^ ]*
немного короче эквивалентной, но более явной нотации [^ ]\{1,\}
, а вторая может столкнуться с проблемами с GNU sed
(хотя, если вы используете --posix
в качестве опции, даже GNU sed
не может нафиг это). OTOH, если класс символов, который должен быть повторен, был более сложным, числовая нотация выигрывает для краткости. Его легко расширить, чтобы обрабатывать "пустую или табуляцию" как разделитель, или "множественные пробелы" или "множественные пробелы или вкладки". Он также может быть изменен для обработки необязательных заготовок (или вкладок) перед первым полем и т.д.
Для awk
и cut
см. Sampson-Chen ответ. Существуют и другие способы записи awk
script, но они не намного лучше, чем ответ. Обратите внимание, что вам может потребоваться явно задать разделитель полей (-F" "
) в awk
, если вы не хотите, чтобы вкладки обрабатывались как разделители или у вас могло быть несколько пробелов между полями. Стандарт POSIX cut
не поддерживает множественные разделители между полями; GNU cut
имеет полезную, но нестандартную опцию -i
, позволяющую использовать несколько разделителей между полями.
Вы также можете сделать это в чистой оболочке:
while read junk1 junk2 residue
do echo "$residue"
done < in-file > out-file
Ответ 6
Довольно просто сделать это только с оболочкой
while read A B C; do
echo "$C"
done < oldfile >newfile
Ответ 7
Perl:
perl -lane 'print join(' ',@F[2..$#F])' File
AWK:
awk '{$1=$2=""}1' File
Ответ 8
Это может сработать для вас (GNU sed):
sed -r 's/^([^ ]+ ){2}//' file
или для столбцов, разделенных одним или несколькими пробелами:
sed -r 's/^(\S+\s+){2}//' file
Ответ 9
Используйте kscript
kscript 'lines.split().select(-1,-2).print()' file
Ответ 10
Используя awk и, основываясь на некоторых из приведенных ниже опций, использование цикла for делает немного более гибким; иногда я могу удалить первые 9 столбцов (например, я делаю "ls -lrt" ), поэтому я меняю 2 на 9 и что он:
awk '{ for(i=0;i++<2;){$i=""}; print $0 }' your_file.txt