我想在文件的每一行末尾添加一个新的行字符'\ 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 ...
...
答案 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
我在所有|
和/
上加上了空格,并在所有:
后面加上了任意数量的不带标签的无标签。
我使用了一个截断的输出重定向,因为我一步完成了所有操作。如果您要保留的文件中有东西,请返回到附录。