Как я могу добавить вывод "ls" в конец предыдущей строки в текстовом файле с пробелом между ними? - PullRequest
0 голосов
/ 19 октября 2019

Как добавить вывод ls в конец строки в текстовом файле, а не в отдельную строку в конце файла?

Например, когда я делаю:

ls ${OUTDIR}/{SUB}/rh.*fs6.nii.gz >> practice.txt
ls ${OUTDIR}/{SUB}/lh.*fs6.nii.gz >> practice.txt

В текстовом файле это выглядит так:

user/sb/sub/rh.5432.fs6.nii.gz
user/sb/sub/lh.5432.fs6.nii.gz

Но мне нужно, чтобы это выглядело так:

user/sb/sub/rh.5432.fs6.nii.gz user/sb/sub/lh.5432.fs6.nii.gz

Мне нужно исправить в Bash и попытался-n после ls.

Ответы [ 3 ]

0 голосов
/ 19 октября 2019

Вы можете просто использовать символы специальных шаблонов , включенные в [...], для соответствия l и r, что приведет к тому, что одна команда ls будет совпадать с lh и rhиспользуя [lr]h. В вашем случае:

ls ${OUTDIR}/{SUB}/[lr]h.*fs6.nii.gz >> practice.txt

( примечание: вы, похоже, пропускаете '$' до ${SUB} в своем выражении, если вы собираетесь использовать SUB=sub)

0 голосов
/ 19 октября 2019

Может быть важно сначала заметить, что когда вы делаете some_command rh.*fs6.nii.gz, это оболочка, которая расширяет выражение rh.*fs6.nii.gz до списка имен файлов, которые существуют в файловой системе и соответствуют шаблону, и передает этот список * 1003. * в качестве отдельных параметров.

ls выводит одну строку на параметр, который существует в файловой системе. echo выводит свои параметры разделенными пробелом. Так что если вы хотите вывести файлы, разделенные пробелами, то echo больше подходит для вашей цели, например:

echo "${OUTDIR}/${SUB}"/rh.*fs6.nii.gz "${OUTDIR}/${SUB}"/lh.*fs6.nii.gz >> practice.txt

В этом конкретном примере, как @ david-c-rankin указал, что шаблоны glob также могут помочь вам сделать команду более компактной:

echo "${OUTDIR}/${SUB}"/[lr]h.*fs6.nii.gz >> practice.txt

И не забудьте заключить в кавычки переменные, используемые в аргументах командной строки (как я делал во всех приведенных выше примерах). ).

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

0 голосов
/ 19 октября 2019

Как насчет:

awk -v v="$(echo `ls -C ${OUTDIR}/${SUB}/lh.*fs6.nii.gz`)" '
  BEGIN{printf >> "practice"}
  NR>1{print line}
  {line=$0}
  END{print line, v}
' practice.txt > p2.txt ; mv p2.txt practice.txt
...