Объединить несколько файлов в один файл строки с разделителем - PullRequest
0 голосов
/ 15 мая 2018

ОБНОВЛЕНО QS: Я работал над сценарием bash, который объединит несколько текстовых файлов с числовыми значениями в один текстовый файл с одной строкой, используя разделитель для каждого значения файла при объединении

Пример:

File1.txt has the followling contents:
168321099
File2.txt has:
151304
151555
File3.txt has:
16980925
File4.txt has:
154292
149092

Now i want a output.txt file like below:
, 168321099 151304 151555 16980925 , 154292 149092

В основном каждый файл, разделенный пробелом и одной строкой . с запятой в качестве первого и 6 полем строки вывода

пробовал:

cat * > out.txt but its not coming as expected

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Я не очень уверен, правильно ли я понял ваш вопрос, но я истолковал его следующим образом:

  • Набор файлов file1,...,filen содержит набор слов, которые вы хотите напечатать в одной строке.
  • Каждое слово разделено пробелом
  • В дополнение к строке слов, вы хотите, чтобы первый символ был ,, а между словами 4 и 5 вы хотели бы иметь ,.

Решение cat + tr + awk:

$ cat <file1> ... <filen> | tr '\n' ' ' | awk '{$1=", "$1; $4=$4" ,"; print}'

Решение awk:

$ awk 'NR==1||NR==4{printf s",";s=" "}{printf " "$1}' <file1> ... <filen>
0 голосов
/ 15 мая 2018

Если число строк в файле является постоянным, то самый простой способ - tr, как предложил @Littlefinix, с парой анонимных файлов для ввода запятых и эхом в конце, чтобы добавить явный символ новой строки встрока вывода:

cat <(echo ",") File1.txt File2.txt File3.txt <(echo ",") File4.txt | tr "\n" " " > out.txt; echo >> out.txt

out.txt - это именно то, что вы указали:

, 168321099 151304 151555 16980925 , 154292 149092

Если число строк в файле ввода может отличаться (например, File2.txt имеет 3 или 4строки и т. д.), тогда размещение запятых всегда в 1-м и 6-м поле будет более сложным, и вам, вероятно, понадобится сценарий, а не однострочный.

0 голосов
/ 15 мая 2018

Следующий сингл awk может помочь вам в том же.

awk 'FNR==1{count++;} {printf("%s%s",count==1||(count==(ARGC-1)&&FNR==1)?", ":" ",$0)} END{print ""}' *.txt

Добавление решения в форме не одного лайнера тоже сейчас.

awk '
FNR==1        {   count++                                                         }
              {   printf("%s%s",count==1||(count==(ARGC-1)&&FNR==1)?", ":" ",$0)  }
END           {   print ""                                                        }
' *.txt
0 голосов
/ 15 мая 2018

Если tr доступно в вашей системе, вы можете сделать следующее cat * | tr "\n" " " > out.txt

tr "\n" " " переводит все разрывы строк в пробелы

...