Как добавить заголовок в текстовый файл в Bash? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть текстовый файл, и я хочу преобразовать его в файл CSV, прежде чем преобразовать его, я хочу добавить заголовок в текстовый файл, чтобы файл CSV имел такой же заголовок. У меня есть тысяча столбцов в текстовом файле и я хочу иметь тысячу имен столбцов. В качестве примечания, содержимое текстового файла представляет собой просто строки некоторых чисел, разделенных запятой ",". Есть ли способ добавить строку заголовка в bash?

Я пробовал путь ниже и не работал. Сначала я выполнил команду ниже в python.

> for i in range(1001):
   > print "col" + "_" + "i"

сохраните выходные данные этого в текстовом файле с помощью этой команды (python header.py >> header.txt) и добавьте выходные данные этого в формате текстового файла в исходный текстовый файл, который у меня есть, как показано ниже:

cat header.txt filename.txt> newfilename.txt

затем преобразуйте текстовый файл в файл csv с помощью «mv newfilename.txt newfilename.csv». Но, к сожалению, этот способ не работает, так как строка заголовка по некоторым причинам имеет двойное количество других строк. Буду признателен за любую помощь, чтобы решить эту проблему.

Ответы [ 4 ]

0 голосов
/ 28 августа 2018
printf "col%s," {1..100} |
sed 's/,$//' |
cat - filename.txt >newfilename.txt

Я полагаю, sed должен предоставить отсутствующий заключительный символ новой строки в качестве побочного эффекта. Если нет, то, возможно, попробуйте 's/,$/\n/', хотя это не совсем переносимо. Вы также можете заменить cat на sed, что-то вроде

... | sed 's/,$//;r filename.txt'

но опять же, я не совсем уверен, насколько это портативно.

0 голосов
/ 27 августа 2018

на основе описания, ваш файл уже разделен запятой, как и CSV-файл. Вы просто хотите добавить строку заголовка номера столбца.

$ awk -F, 'NR==1{for(i=1;i<=NF;i++) printf "col_%d%s", $i,(i==NF?ORS:FS)}1' file

добавит заголовки столбцов столько же, сколько полей в первой строке файла

, например

$ seq 5 | paste -sd, |      # create 1,2,3,4,5 as a test input
  awk -F, 'NR==1{for(i=1;i<=NF;i++) printf "col_%d%s", i, (i==NF?ORS:FS)}1'

col_1,col_2,col_3,col_4,col_5
1,2,3,4,5
0 голосов
/ 27 августа 2018

Используйте seq и sed

Вы можете использовать утилиту seq для создания своего CSV-заголовка, с небольшой помощью из расширений Bash. Затем вы можете вставить новую строку заголовка в существующий файл CSV или объединить заголовок с вашими данными.

Например:

# construct a quoted CSV header
columns=$(seq -f '"col_%g"' -s', ' 1 1001)

# strip the trailing comma
columns="${columns%,*}"

# insert headers as first line of foo.csv with GNU sed
sed -i -e "1 i\\${columns}" /tmp/foo.csv

Предостережения

Если у вас нет GNU sed, вы также можете использовать cat, sponge или другие инструменты для объединения заголовка и данных, хотя для большинства ваших вариантов объединения потребуется перенаправление в новый объединенный файл, чтобы избежать слипания существующих данных. .

Например, в качестве исходного файла данных укажите / tmp / data.csv :

seq -f '"col_%g"' -s', ' 1 1001 > /tmp/header.csv
sed -i -e 's/,[[:space:]]*$//' /tmp/header.csv
cat /tmp/header /tmp/data > /tmp/new_file.csv

Кроме того, обратите внимание, что хотя решения Bash, позволяющие избежать вызова стандартных утилит, возможны, выполнение этого в чистом Bash может быть слишком медленным или требовательным к памяти для больших наборов данных.

Ваш пробег может отличаться.

0 голосов
/ 27 августа 2018

Вы можете генерировать имена столбцов в bash, используя один из параметров ниже. Каждый пример генерирует файл header.txt. У вас уже есть код, чтобы добавить его в начало вашего файла в качестве заголовка.

Использование циклов bash

Циклы Bash для такого количества итераций будут неэффективными, но будут работать.

for i in {1..10}; do
  echo -n "col_$i "
done > header.txt
echo >> header.txt

или используя seq

for i in $(seq 1 1000); do
  echo -n "col_$i "
done > header.txt
echo >> header.txt

Использование только seq

Использование одного только seq будет более эффективным.

seq -f "col_%g" -s" " 1 1000 > header.txt
...