изменить текст в файле (миллионы столбцов, разделенных табуляцией) - удалить все вкладки, кроме первой, и добавить новые столбцы за последним столбцом - PullRequest
3 голосов
/ 15 июня 2011

Здесь я хочу получить ваши подсказки по модификации текстового файла.

Я хочу изменить текст в файле (миллионы столбцов, разделенных табуляцией) - удалить все вкладки, кроме первой, и добавить новые столбцы за последним столбцом.

  • файл (4 столбца здесь, но миллионы столбцов в моем реальном файле, табуляция) у меня сейчас:

    day1 1 3 7
    day7 2 4 8
    day3 2 5 6
    
  • файл, который я хочу, удалите разделитель (от второго), и добавить три новые столбцы (один такой же, как первый, два других с тем же значения во всем одинаковом столбце, здесь х и у).

    day1 137 day1 x y
    day7 248 day7 x y
    day3 256 day3 x y
    

Я собираюсь сделать это с помощью awk, смешанного с sed. Но я пробовал много разных способов, я все еще не знаю, как это сделать.

Не могли бы вы дать мне какую-нибудь помощь? Заранее спасибо.

Best

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Вопрос помечен [perl] , поэтому для полноты:

#! /usr/bin/perl -lan

BEGIN { $, = "\t" }

$first = shift @F;
print $first, join("", @F), $first, qw/ x y /;

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

  • настройка$, для символа TAB, аналогично FS в awk
  • -l, чтобы неявно добавить "\n" к каждому print, что работает как ORS в awk
  • переключатель -a (режим автоматического разделения или awk)

включает режим автоматического разделения при использовании с -n или -p.Неявная команда split для массива @F выполняется как первая вещь в неявном цикле while, создаваемом -n или -p.

perl -ane 'print pop(@F), "\n";'

эквивалентна

while (<>) {
  @F = split(' ');
  print pop(@F), "\n";
}
  • переключатель -n для неявного цикла по всем строкам ввода

заставляет Perl предполагать следующий цикл вокругваша программа, которая заставляет ее перебирать аргументы имени файла, например, sed -n или awk:

LINE:
while (<>) {
  ...  # your program goes here
}
2 голосов
/ 15 июня 2011

Использование gawk -f script.awk < input > output, где script.awk содержит:

{
    old=$1;
    $0 = substr($0, length($1)+1);
    gsub(/[[:space:]]*/, "", $0);
    print old, $0, old, "x", "y";
} 

Смотрите живую демоверсию здесь (спасибо belisarius за показ мне этот сайт)

1 голос
/ 18 марта 2012

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

sed 's/\t//2g;s/\(.*\t\)\(.*\)/&\t\1x\ty/' file
day1    137     day1    x       y
day7    248     day7    x       y
day3    256     day3    x       y

Я предполагаю, что, поскольку это файл, разделенный табуляцией, вы хотите, чтобы новые столбцы были разделены табуляцией.Если нет:

sed 's/\t//2g;s/\(.*\)\t\(.*\)/& \1 x y/' file
day1    137 day1 x y
day7    248 day7 x y
day3    256 day3 x y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...