Awk 使用#SBATCH向多个文件(900+;)添加列
我正在尝试向文件中添加列:Awk 使用#SBATCH向多个文件(900+;)添加列,awk,sed,terminal,sbatch,Awk,Sed,Terminal,Sbatch,我正在尝试向文件中添加列: 1 12098 12258 0.00 1 12553 12721 1.37 1 13331 13701 34.69 1 30334 30503 0.00 1 35045 35544 0.00 1 35618 35778 0.00 1 69077 70017 0.24 1 324294 324394 0.68 1
1 12098 12258 0.00
1 12553 12721 1.37
1 13331 13701 34.69
1 30334 30503 0.00
1 35045 35544 0.00
1 35618 35778 0.00
1 69077 70017 0.24
1 324294 324394 0.68
1 324427 325605 3.18
看起来是这样的:
1 12098 12258 unknown 0.00
1 12553 12721 unknown 1.37
1 13331 13701 unknown 34.69
1 30334 30503 unknown 0.00
1 35045 35544 unknown 0.00
1 35618 35778 unknown 0.00
1 69077 70017 unknown 0.24
1 324294 324394 unknown 0.68
1 324427 325605 unknown 3.18
我已使用以下命令成功完成此操作:
awk '$3 = $3 FS "unknown"' <file> > <new_file>
awk'$3=$3 FS“未知”>
然而,我有900多个文件,我也需要这样做,并在每次输出到一个新的文件。我发现awk很难理解,我想知道是否有一种方法可以使用#SBATCH脚本或任何其他方法一次处理多个文件
我对stack overflow还不太熟悉,所以非常感谢您的帮助!谢谢大家! 编辑:根据OP的注释添加解决方案,以将输出保存到输出文件。请尝试以下操作
awk '
FNR==1{
close(out_file)
sub(/\./,"_new&",FILENAME)
out_file=FILENAME
}
{
$NF="unknown" OFS $NF
print > (out_file)
}' *.bed
awk '{$NF="unknown" OFS $NF} 1' Input_file
如果你不担心行与行之间的间距,那么你可以尝试以下操作
awk '
FNR==1{
close(out_file)
sub(/\./,"_new&",FILENAME)
out_file=FILENAME
}
{
$NF="unknown" OFS $NF
print > (out_file)
}' *.bed
awk '{$NF="unknown" OFS $NF} 1' Input_file
或使用GNUawk
最新版本,请尝试:
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file(s)
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file | column -t
为了使空格看起来更美观,您也可以将
列添加到上述命令中:
awk '{$NF="unknown" OFS $NF} 1' Input_file | column -t
或使用GNUawk
最新版本,请尝试:
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file(s)
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file | column -t
编辑:根据OP的注释添加解决方案以将输出保存到outputfiles尝试以下操作
awk '
FNR==1{
close(out_file)
sub(/\./,"_new&",FILENAME)
out_file=FILENAME
}
{
$NF="unknown" OFS $NF
print > (out_file)
}' *.bed
awk '{$NF="unknown" OFS $NF} 1' Input_file
如果你不担心行与行之间的间距,那么你可以尝试以下操作
awk '
FNR==1{
close(out_file)
sub(/\./,"_new&",FILENAME)
out_file=FILENAME
}
{
$NF="unknown" OFS $NF
print > (out_file)
}' *.bed
awk '{$NF="unknown" OFS $NF} 1' Input_file
或使用GNUawk
最新版本,请尝试:
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file(s)
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file | column -t
为了使空格看起来更美观,您也可以将列添加到上述命令中:
awk '{$NF="unknown" OFS $NF} 1' Input_file | column -t
或使用GNUawk
最新版本,请尝试:
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file(s)
gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1' Input_file | column -t
下面是一个替代的sed
解决方案,用于进行此更改并以内联方式保存更改:
sed -E -i.bak 's/[^[:blank:]]+$/unknown &/' *.txt
下面是一个替代的sed
解决方案,用于进行此更改并以内联方式保存更改:
sed -E -i.bak 's/[^[:blank:]]+$/unknown &/' *.txt
谢谢你的建议。我想对多个文件同时执行此操作有没有方法?Thanks@hdjc90,如果您有最新版本的GNU awk,它也有就地保存和文件备份,请删除备份文件选项-v inplace_SUFFIX=.bak
如果您不想备份文件,请告诉我?您好@RavinderSingh13谢谢您的帮助。为了澄清,我想输入一个命令来执行我的所有文件(例如.*.bed)并输出它们(例如..*u new.bed)?@hdjc90,请检查我的编辑解决方案,让我知道这是否对您有帮助?谢谢您的建议。我想对多个文件同时执行此操作有没有方法?Thanks@hdjc90,如果您有最新版本的GNU awk,它也有就地保存和文件备份,请删除备份文件选项-v inplace_SUFFIX=.bak
如果您不想备份文件,请告诉我?您好@RavinderSingh13谢谢您的帮助。为了澄清,我想输入一个命令来处理我的所有文件(例如.*.bed)并将它们全部输出(例如..*u new.bed)?@hdjc90,请检查我的编辑解决方案,让我知道这是否有帮助?保留列之间的间距对您重要吗?如果是这样的话,是制表符、空格还是其他什么?保留列之间的间距对您来说重要吗?如果是这样的话,那是标签、空白还是其他什么?嗨@anubhava,谢谢你!它工作得很好。我想知道是否可以只对单独文件中列出的文件名执行此命令?感谢阿加因特说文件名存储在一个名为files.txt
的文件中,然后你可以使用:sed-E-i.bak的/[^[:blank:][]+$/unknown&/'$(太棒了!感谢@anubhava工作得很好!最后一个问题,你能让sed在后台工作吗?是的,把&
放在命令的末尾,比如:sed-E-i.bak's/[^[:blank:]+$/unknown&/'$(嗨@anubhava,谢谢你!它工作得很好。我想知道是否可以只对单独文件中列出的文件名执行此命令?感谢Againer的说法,文件名存储在名为files.txt
的文件中,然后你可以使用:sed-E-I.bak's/[^[:blank:]+$/unknown&/'$(太棒了!谢谢@anubhava工作得很好!最后一个问题,你能让sed在后台工作吗?是的,把&
放在命令的末尾,比如:sed-E-i.bak的/[^[:blank:]+$/unknown&/'$(