我有多个文本文件,每个文本文件包含两列,我希望在bash中复制每个文件中的第一列,最后有三列。
文件:
sP100227 1
sP100267 1
sP100291 1
sP100493 1输出文件:
sP100227 sP100227 1
sP100267 sP100267 1
sP100291 sP100291 1
sP100493 sP100493 1我试过:
txt=path/to/*.txt
echo "$(paste <(cut -f1-2 $txt) > "$txt"发布于 2020-12-04 21:00:51
cut和paste中的默认分隔符是TAB,但是您的文件看起来是空格分隔的。
您不能使用相同的文件作为输入和输出重定向,因为当shell打开输出文件时,它会截断它,所以程序没有什么可读取的。写入一个新文件,然后重命名它。
您的paste命令只有一个输入文件。没有必要使用echo。
paste -d' ' <(cut -d' ' -f1 "$txt") "$txt" > "$txt.new" && mv "$txt.new" "$txt"使用awk可以更容易地做到这一点。
awk '{print $1, $0}' "$txt" > "$txt.new" && mv "$txt.new" "$txt"GNU awk有一个适当的扩展,所以如果您愿意的话可以使用它。请参阅Save modifications in place with awk
发布于 2020-12-04 20:57:02
你能试一下吗。用GNU awk中显示的示例编写并测试。这将将字段添加到只有2个字段的行中。
awk 'NF==2{$1=$1 OFS $1} 1' Input_file如果您不关心字段的数量,只想拥有第一个字段的值2次,然后尝试如下。
awk '{$1=$1 OFS $1} 1' Input_file或者,如果您的Input_file中只有两个字段,那么我们不需要重写完整的行,只需按如下方式打印它们。
awk '{print $1,$1,$2}' Input_file若要将输出保存到相同的Input_file中,请为上述解决方案追加> temp && mv temp Input_file (测试后)。
发布于 2020-12-04 21:04:31
使用临时文件( cut -f1和paste ),如下所示:
paste <(cut -f1 in_file) in_file > tmp_file
mv tmp_file in_file或者,使用Perl一行程序,如下所示:
perl -i.bak -lane 'print join "\t", $F[0], $_;' in_filePerl一行程序使用以下命令行标志:
-e:告诉Perl在行中查找代码,而不是在文件中。
-n:每次循环输入一行,默认情况下将其分配给$_。
-l:在执行代码行之前,先去掉输入行分隔符(默认情况下是*NIX上的"\n"),然后在打印时追加它。
-a:在空格或在-F选项中指定的正则表达式上将$_拆分为数组@F。
-i.bak:就地编辑输入文件(覆盖输入文件).在重写之前,将扩展名.bak附加到原始文件的备份副本中。
还请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
https://stackoverflow.com/questions/65150581
复制相似问题