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

时间:2019-07-19 07:51:40

标签: bash loops newline

我想在文件的每一行末尾添加一个新的行字符'\ 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    ...
...

3 个答案:

答案 0 :(得分:0)

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 <input的操作基本上就是通过单笔awk '...' input完成的操作。

我没有完全想要实现的目标,我认为您误解了一些东西,但是如果我认为正确,那么这就是您想要的目标。

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

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

答案 1 :(得分:0)

怎么样:

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

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

答案 2 :(得分:0)

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

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

我在所有|/上加上了空格,并在所有:后面加上了任意数量的不带标签的无标签。

我使用了一个截断的输出重定向,因为我一步完成了所有操作。如果您要保留的文件中有东西,请返回到附录。