【问题标题】:How can I append "ls" output to the end of a previous line in text file w/ space in between?如何将“ls”输出附加到文本文件中前一行的末尾,中间有空格?
【发布时间】:2019-10-19 03:33:44
【问题描述】:

如何将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 中进行修复,并在 ls 之后尝试了 -n

【问题讨论】:

标签: bash ls


【解决方案1】:

怎么样:

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

【讨论】:

    【解决方案2】:

    您可以简单地使用包含在[...] 中的特殊模式字符 来匹配lr,这将导致单个ls 命令同时匹配lh 和@987654326 @使用[lr]h。在你的情况下:

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

    注意:如果您打算使用SUB=sub,您的表达式中似乎缺少'$' 之前的'$'

    【讨论】:

    • 这里使用 ls 有什么意义,为什么不直接回显呢? ls 命令同时匹配 lh 和 rh 听起来是错误的,因为 shell 执行路径名扩展
    • 嗯,他想ls 两组模式并用空格连接它们。这是将两个 ls 转换为单个 ls 的最简单方法,这将导致空间分隔输出。
    • 但是使用 ls 是没有意义的,至少你可以注意到
    • 是的,这完全不清楚。如果这不是他要找的东西,那么问题就是问一些与看起来完全不同的东西。 ls -n 完全没有意义,除非他们想要 -n, --numeric-uid-gid
    • @oguzismail 我想我明白你在说什么,ls 与生成空格分隔列表无关,可以使用for 循环并输出分隔的文件空间做得更好方式(如果这就是他所追求的 - 我同意 - 并在子shell中执行此操作,只需重定向子shell的输出一次)
    【解决方案3】:

    首先需要注意的是,当您执行some_command rh.*fs6.nii.gz 时,shell 会将表达式rh.*fs6.nii.gz 扩展为文件系统中存在并匹配模式的文件名列表,并将该列表传递给@987654325 @ 作为单独的参数。

    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
    

    并且不要忘记在命令行参数中使用双引号(就像我在上面所有示例中所做的那样)。

    最后,it's not recommended to parse the output of ls 无论如何,请记住始终寻找更好的替代方案。

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      相关资源
      最近更新 更多