Подтвердить что ты не робот

Обмен двумя столбцами - awk, sed, python, perl

У меня есть данные в большом файле (ширина 280 колонок, 7 миллионов строк!), и мне нужно поменять первые два столбца. Я думаю, что я мог бы сделать это с помощью какого-то awk для цикла, чтобы напечатать $2, $1, затем диапазон до конца файла, но я не знаю, как сделать часть диапазона, и я не могу напечатать $2, $1, $3... $280! Большинство ответов об обмене столбцами, которые я видел здесь, относятся к небольшим файлам с управляемым количеством столбцов, поэтому мне нужно что-то, что не зависит от указания каждого номера столбца.

Файл с разделителями табуляции:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989
4b9b3361

Ответ 1

Вы можете сделать это, заменив значения первых двух полей:

awk ' { t = $1; $1 = $2; $2 = t; print; } ' input_file

Ответ 2

Я попробовал ответ perreal с cygwin в системе Windows с разделенным вкладкой файлом. Это не сработало, потому что стандартный разделитель - это пробел.

Если вы столкнулись с одной и той же проблемой, попробуйте это вместо:

awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file

Входящий разделитель определяется -F $'\t', а разделитель для вывода - OFS=$'\t'.

awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file > output_file

Ответ 3

Вы пытались использовать команду cut? Например.

cat myhugefile | cut -c10-20,c1-9,c21- > myrearrangedhugefile

Ответ 4

Попробуйте сделать это более актуальным для вашего вопроса:

awk '{printf("%s\t%s\n", $2, $1)}' inputfile

Ответ 5

Это может сработать для вас (GNU sed):

sed -i 's/^\([^\t]*\t\)\([^\t]*\t\)/\2\1/' file

Ответ 6

Это также легко в perl:

perl -pe 's/^(\S+)\t(\S+)/$2\t$1/;' file > outputfile

Ответ 7

Вы можете сделать это в Perl:

perl -F\\t -nlae 'print join("\t", @F[1,0,2..$#F])' inputfile

-F указывает разделитель. В большинстве оболочек вам нужно предшествовать обратную косую черту другой, чтобы избежать ее. На некоторых платформах -F автоматически подразумевается -n и -a, чтобы их можно было отбросить.

Для вашей проблемы вам не нужно использовать -l, потому что последние столбцы отображаются последними в выходном файле. Но если в другой ситуации, если последний столбец должен появиться между другими столбцами, символ новой строки должен быть удален. Переключатель -l позаботится об этом.

"\t" в соединении можно изменить на что-либо еще, чтобы создать другой разделитель на выходе.

2..$#F указывает диапазон от 2 до последнего столбца. Как вы могли догадаться, внутри квадратных скобок вы можете поместить любой столбец или диапазон столбцов в желаемом порядке.