更改 sed 中许多文件的最后一行 - sed 仅更改第一行
Changing last line in many files in sed - sed only change in first
这是我的脚本
#!/bin/bash
for num in {1..100};
do
sed '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' eq8_$num.gro | tee eq9_$num.gro
done
我要更换
" 6.36535 23.3762512.09434" 到 " 6.76889 21.76071 12.19032" (白色 space 在这种情况下很重要,文件的行数不同,这是每个文件的最后一行)。
Sed 只处理第一个文件。
输入示例
eq8_1.gro
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
227BGL C529155 4.134 15.788 5.556
227BGL H529156 4.186 15.879 5.529
19144SOL OW73518 0.911 13.325 6.427
19144SOL HW173519 0.879 13.256 6.485
20389SOL OW77253 0.644 14.144 5.376
20389SOL HW177254 0.712 14.203 5.344
6.36535 23.3762512.09434
eq8_2.gro
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL HW175853 4.186 14.169 5.941
19922SOL HW275854 4.071 14.076 5.973
19924SOL OW75858 1.466 20.721 5.803
19924SOL HW175859 1.489 20.642 5.852
6.36535 23.3762512.09434
输出示例
eq9_1.gro
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
227BGL C529155 4.134 15.788 5.556
227BGL H529156 4.186 15.879 5.529
19144SOL HW173519 0.879 13.256 6.485
19144SOL HW273520 1.007 13.318 6.431
20389SOL HW177254 0.712 14.203 5.344
20389SOL HW277255 0.577 14.201 5.413
6.76889 21.76071 12.19032
eq9_2.gro(最后一行没变,为什么?)
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL OW75852 4.097 14.168 5.977
19922SOL HW175853 4.186 14.169 5.941
19924SOL OW75858 1.466 20.721 5.803
19924SOL HW175859 1.489 20.642 5.852
6.36535 23.3762512.09434
我也尝试不同的方法
#!/bin/bash
for num in {1..100};
do
sed -i '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' eq8_$num.gro
done
也不行。
如果您不知道如何在 sed 中执行此操作,也许您知道如何在 awk 中执行此操作?
您是否尝试过 sed -i 's/Pattern1/Pattern2/g' 最后的 g 对文件中所有匹配的模式进行了全局替换。
这可能对你有用(GNU sed 和并行):
parallel -q sed -s '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' ::: eq8_{1..100}.gro
这会将上述 sed 替换命令应用于从 eq8_1.gro
到 eq8_100.gro
的 100 个文件的最后一行。
输出将到达标准输出并可以被捕获> outFile
。
N.B。原文件不会被修改。
如果原文件需要原地修改,使用:
parallel -q sed -i.backup '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' ::: eq8_{1..100}.gro
要保留原始文件并生成修改后的新文件,请使用:
parallel sed -s \''$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/'\' \> {.}.new.txt ::: eq8_{1..100}.gro
您可能需要确保文件末尾有换行符。 sed
实现通常对 $
的含义很挑剔。考虑例如
sed -i.bak -e '$a\' file
如果您的 shell 允许,甚至更好:
[ -n "$(tail -c1 file)" ] && printf '\n' >>file
这是我的脚本
#!/bin/bash
for num in {1..100};
do
sed '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' eq8_$num.gro | tee eq9_$num.gro
done
我要更换 " 6.36535 23.3762512.09434" 到 " 6.76889 21.76071 12.19032" (白色 space 在这种情况下很重要,文件的行数不同,这是每个文件的最后一行)。
Sed 只处理第一个文件。 输入示例
eq8_1.gro
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
227BGL C529155 4.134 15.788 5.556
227BGL H529156 4.186 15.879 5.529
19144SOL OW73518 0.911 13.325 6.427
19144SOL HW173519 0.879 13.256 6.485
20389SOL OW77253 0.644 14.144 5.376
20389SOL HW177254 0.712 14.203 5.344
6.36535 23.3762512.09434
eq8_2.gro
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL HW175853 4.186 14.169 5.941
19922SOL HW275854 4.071 14.076 5.973
19924SOL OW75858 1.466 20.721 5.803
19924SOL HW175859 1.489 20.642 5.852
6.36535 23.3762512.09434
输出示例
eq9_1.gro
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
227BGL C529155 4.134 15.788 5.556
227BGL H529156 4.186 15.879 5.529
19144SOL HW173519 0.879 13.256 6.485
19144SOL HW273520 1.007 13.318 6.431
20389SOL HW177254 0.712 14.203 5.344
20389SOL HW277255 0.577 14.201 5.413
6.76889 21.76071 12.19032
eq9_2.gro(最后一行没变,为什么?)
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL OW75852 4.097 14.168 5.977
19922SOL HW175853 4.186 14.169 5.941
19924SOL OW75858 1.466 20.721 5.803
19924SOL HW175859 1.489 20.642 5.852
6.36535 23.3762512.09434
我也尝试不同的方法
#!/bin/bash
for num in {1..100};
do
sed -i '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' eq8_$num.gro
done
也不行。
如果您不知道如何在 sed 中执行此操作,也许您知道如何在 awk 中执行此操作?
您是否尝试过 sed -i 's/Pattern1/Pattern2/g' 最后的 g 对文件中所有匹配的模式进行了全局替换。
这可能对你有用(GNU sed 和并行):
parallel -q sed -s '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' ::: eq8_{1..100}.gro
这会将上述 sed 替换命令应用于从 eq8_1.gro
到 eq8_100.gro
的 100 个文件的最后一行。
输出将到达标准输出并可以被捕获> outFile
。
N.B。原文件不会被修改。
如果原文件需要原地修改,使用:
parallel -q sed -i.backup '$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/' ::: eq8_{1..100}.gro
要保留原始文件并生成修改后的新文件,请使用:
parallel sed -s \''$s/ 6.36535 23.3762512.09434/ 6.76889 21.76071 12.19032/'\' \> {.}.new.txt ::: eq8_{1..100}.gro
您可能需要确保文件末尾有换行符。 sed
实现通常对 $
的含义很挑剔。考虑例如
sed -i.bak -e '$a\' file
如果您的 shell 允许,甚至更好:
[ -n "$(tail -c1 file)" ] && printf '\n' >>file