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
或使用GNU
awk
最新版本,请尝试:

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
或使用GNU
awk
最新版本,请尝试:

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
或使用GNU
awk
最新版本,请尝试:

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
或使用GNU
awk
最新版本,请尝试:

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&/'$(