如何在循环中附加新行 \n

How to append new line \n in a loop

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

这是我的代码:

while read -r line
do
echo "$line"|awk -F'\t' '{
        print();
        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    ...
...

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

while read -r line
do
    echo "$line"|awk -F'\t' '{
        print();
        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 可能是一个不错的选择。 为我们提供更多输入和预期输出示例

编辑

根据您的 input/output 描述,我认为您可以在这部分进行很多改进。

你做 while read line; do echo "$line" | awk '...'; done <input 这基本上是你通过一个 awk '...' input.

得到的

我不明白你到底想达到什么目的,我认为你误解了一些东西,但如果我认为是正确的,那么这就是你想要的。

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

在这里,我首先删除了每列中第一个 : 后面的内容,然后将字符 |/ 替换为 space。 这是否满足您的需求?

怎么样:

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

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

也许你把这个复杂化了。 (XY Problem?)

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

我将所有 |/ 都用空格分隔,任何 : 后跟任意数量的 non-tabs,什么都没有。

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