Как написать второй столбец в Bash в существующем текстовом файле - PullRequest
2 голосов
/ 16 января 2020

Мне нужно извлечь имя идентификатора родительского каталога и поместить его в текстовый файл с разделителями табуляции. Затем мне нужно извлечь имена содержимого этой папки и поместить в ту же строку, что и имя ID, которое я впервые извлек. По существу, в столбце 1 должно быть указано имя каталога от родительского, в столбце 2 должен быть указан имя первого файла в этом каталоге, в столбце 3 должно быть имя следующего файла и т. Д. И т. Д.

/ path / to / folder / ID /

pwd | xargs echo | awk -F "/" '{print $n; exit}' >> Text.txt

, где 'n' - местоположение нужной родительской папки (в данном случае, ID). Это работает нормально и записывает что-то вроде «ID001» в мой файл Text.txt.

Я снова пробую тот же маленький хак, используя мой pwd в качестве входных данных для xargs, перечисляя содержимое этой папки, и записывая имена в мой файл Text.txt:

pwd | xargs echo | awk -F "/" '{print $7; exit}' >> Text.txt | pwd | xargs echo | xargs ls | xargs echo >> Text.txt

Но вместо

ID001 file1 file2

я получаю

file1 file2
ID001

Что в основном следовало ожидать, учитывая команды. Я не понимаю, почему имена моих файлов добавляются в строку first , а не в строку last . Единственной связанной статьей, которую я смог найти, была эта запись для записи указанного столбца c в CSV , но это было не совсем то, что я искал.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Этот find плюс awk конвейер МОЖЕТ быть тем, что вы пытаетесь сделать:

$ ls tmp
a  b

$ find tmp -print | awk '{sub("^[^/]+/",""); printf "%s%s", sep, $0; sep="\t"} END{print ""}'
tmp     a       b

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

0 голосов
/ 17 января 2020

Возможно, вы захотите сделать это как часть нескольких команд; для простоты понимания.

Команды можно поместить в сценарий bash.

Пример сценария

$ pwd
/Users/pa357856/test/tmp/foo
$ ls
file1.txt   file2.txt

команды -

$ parentDIR=`pwd | xargs echo | awk -F "/" '{print $6}'`
$ filesList=`ls`
$ echo "$parentDIR" "$filesList" >> test.txt

Результат -

$ cat test.txt 
foo file1.txt file2.txt
...