如何在循环中附加新行 \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,什么都没有。
我使用了一个截断输出重定向,因为我一步完成了所有操作。如果文件中有您想保留的内容,请返回追加。
我想在文件的每一行末尾添加一个换行符'\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,什么都没有。
我使用了一个截断输出重定向,因为我一步完成了所有操作。如果文件中有您想保留的内容,请返回追加。