2016-07-20 4 views
-5

У меня есть большой текстовый файл с тремя столбцами, каждый столбец разделен четырьмя пробелами. Мне нужен скрипт perl для чтения этого текстового файла и вывода столбцов # 1 и # 2 в новый текстовый файл с каждым из этих столбцов, заключенным в кавычки и разделенные запятые в выходной файл.Perl To Parse Whitespace Separated Columns

Текстовый файл с четырьмя столбцами имеет данные, выглядит следующим образом:

9a2ba3c0580b5f3799ad9d6f487b2d3 /folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg HOST 

То, что я хотел бы выход, чтобы посмотреть, как это

"9a2ba3c0580b5f3799ad9d6f487b2d38","/folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg" 

ответ

2

Простая как однострочная линия:

perl -lane 'print join ",", map qq("$_"), @F[0, 1]' 
  • -l обрабатывает переводы строк в print
  • -n считывает входную линию по линии
  • -a расколы каждой строки на пробелы в @F массив
  • @F[0, 1] является срез массива, он извлекает первые два элемента из массива @F
  • map обертывает каждый элемент в двойных кавычках
  • join вставки запятой между
+0

Кажется, что не работает. Вот результат, который я получаю: Строка найдена там, где оператор ожидал на parse4.pl строке 2, рядом с «дорожкой печати», «map» qq («$ _»), @F [0, 1] '» (Вам нужно предустановить переулок?) синтаксическая ошибка в parse4.pl строка 2, рядом с "lane 'print join", ", map qq (" $ _ "), @F [0, 1]'" Выполнение parse4.pl отменен из-за ошибок компиляции. Я использую Perl v5.18.2. – QuePID

+1

@QuePID: Запустите всю строку в оболочке с добавленным именем файла. Это не сценарий, это однострочный. – choroba

+0

Отлично работает как однострочный, как я могу преобразовать в скрипт? – QuePID

0

Ниже код для справки:

#!/usr/bin/perl 
my $defaultFileName=defined $ARGV[0]?$ARGV[0]:"filename.txt"; 
die "Could not find file: $defaultFileName" unless(-f $defaultFileName); 
open my $fh, '<',"textFileName.log"; 
foreach my $line(<$fh>) { 
    my @tmpData=split(/\s+/, $line); 
    printf "\"%s\",\"%s\"\\n\n",$tmpData[1],$tmpData[2]; 
} 
close $fh; 
+2

1) Вы должны проверить успех 'open' вместо проверки существования файла с помощью' -f': 'open my $ fh, '<', $ file или die $ !;' Прямо сейчас у вас есть гонка состояние. 2) Вы можете использовать 'split ('', $ line)', чтобы игнорировать начальные пробелы. 3) Perl имеет строчную интерполяцию, поэтому, если вам не нужно делать специальное форматирование, 'print' /' say' обычно предпочтительнее 'printf'. В этом случае я бы сделал еще один шаг и использовал 'map' +' join', например. 'my @fields = split ('', $ line); скажем (join (',', map qq {"$ _"}, @fields)); 'или что-то в этом роде. 4) Всегда 'use strict;' и 'use warnings 'all';' – ThisSuitIsBlackNot

-1

Это также может быть сделано с awk

>>cat test 
9a2ba3c0580b5f3799ad9d6f487b2d3 /folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg HOST 
9a2ba3c0580b5f3799ad9d6f487b2d3 /folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg HOST 
9a2ba3c0580b5f3799ad9d6f487b2d3 /folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg HOST 
9a2ba3c0580b5f3799ad9d6f487b2d3 /folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg HOST 

Выход:

>>awk '{FS=" "}{print "\""$1"\",""\""$2"\",""\""$3"\"" }' test 
"9a2ba3c0580b5f3799ad9d6f487b2d3","/folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg","HOST" 
"9a2ba3c0580b5f3799ad9d6f487b2d3","/folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg","HOST" 
"9a2ba3c0580b5f3799ad9d6f487b2d3","/folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg","HOST" 
"9a2ba3c0580b5f3799ad9d6f487b2d3","/folder1/folder2/folder3/folder4/folder5/folder6/folder7_name_PC/images/filename.jpg","HOST" 

>>awk '{FS=" "}{print "\""$1"\",""\""$2"\",""\""$3"\"" }' test > output.txt 

затем output.txt будет иметь желаемый результат.

+0

Это также можно сделать с помощью Ruby, Python, Java, C++ и C, но это не то, о чем нас спрашивают. – ThisSuitIsBlackNot

 Смежные вопросы

  • Нет связанных вопросов^_^