【问题标题】:How to append new line \n in a loop如何在循环中追加新行\ n
【发布时间】:2026-01-27 15:20:10
【问题描述】:

我想在文件的每一行末尾添加一个换行符 '\n'。

这是我的代码:

while read -r line
do
echo "$line"|awk -F'\t' '{
        print($1);
        for (i=2; i<=NF; i++){
                split($i,arr,":")
                print(arr[1])
        };
}' | tr '\n' '\t' | tr '|' ' ' | tr '/' ' ' | {END OF LINE, WANNA ADD NEW LINE} 
>> genotype_processed.txt

done < file_in

另外,有什么方法可以将 3 个 tr 命令合并为一个?它们看起来太多余了。

非常感谢!

编辑

输入看起来像这样:

id123    0|1:a:b:c    0/0:i:j:k    ...
id456    1/1:j:f:z    1|0:.:j:v    ...
...

想要的输出:

id123    0 1    0 0    ...
id456    1 1    1 0    ...
...

【问题讨论】:

  • 一个简单的echo 行不通?
  • @ZumodeVidrio 不,这真的很奇怪。我试过了| echo '\n',这显然不起作用。那么 | echo "\n",在我的文件中只出现了 \n。然后 printf 和 print 也不起作用。我现在不知道该怎么办:(
  • 因为echo 只打印它的参数,而不是输入。除了在管道之后使用echo,您还可以插入带有| sed 's/$/\n/' 的换行符,它将当前行的末尾替换为\n
  • @Zelnes 管道后的 sed 完美运行!非常感谢!
  • 你为什么不在一个awk 内执行所有这些循环,而不是在每一行上产生 4 个以上的进程?无论如何,您都在调用 awk,删除 read 并让它处理整个文件。

标签: bash loops newline


【解决方案1】:

您只能在while 循环结束时打开输出文件一次,然后在循环内执行您想要输出的任何操作。

while read -r line
do
    echo "$line"|awk -F'\t' '{
        print($1);
        for (i=2; i<=NF; i++){
                split($i,arr,":")
                print(arr[1])
        };
    }' | tr '\n' '\t' | tr '|' ' ' | tr '/' ' '
    # This will be the new "newline"
    echo
done < file_in >genotype_processed.txt

顺便说一句,我认为可以通过使用单个命令进行替换来改进您的循环。 sed 可能是一个不错的选择。 为我们提供更多输入和预期输出的示例

编辑

在您的输入/输出描述之后,我认为您可以改进这部分。

您执行while read line; do echo "$line" | awk '...'; done &lt;input,这基本上是您通过执行单个awk '...' input 得到的。

我没有得到你想要达到的确切目标,我认为你误解了一些事情,但如果我认为是正确的,那么这就是你想要的。

sed -r 's/:[^[:blank:]]+//g; s/[|/]/ /g' input

在这里,我首先删除每列中第一个 : 后面的内容,然后将字符 |/ 替换为空格。 这符合您的需求吗?

【讨论】:

    【解决方案2】:

    怎么样:

    while read -r line
     do
    newline="\n"
    echo $line$newline >> genotype_processed.txt
    done < file_in
    

    如果需要保留$line的原始格式,请根据您的要求使用"$line"$newline

    【讨论】:

      【解决方案3】:

      也许你过于复杂了。 (XY Problem?)

      $: sed 's,[|/], ,g; s/:[^   ]*//g;' file_in > genotype_processed.txt
      

      我将所有|/ 用空格替换,任何: 后跟任意数量的非制表符,没有任何内容。

      我使用了单个截断输出重定向,因为我一步完成了所有操作。如果文件中有您想保留的内容,请返回附加内容。

      【讨论】: