【问题标题】:Application of sed command several times on a file在一个文件上多次应用 sed 命令
【发布时间】:2015-08-28 19:18:53
【问题描述】:

我想多次将此 sed 命令应用于文件:

sed '1~2d' file.txt>file1.txt

假设我想做 4 次,有没有办法让这个过程也得到中间文件?

提前谢谢你

最好的问候

(文件为 1m UTM 坐标,我想降低测量精度以使文件易于管理)

【问题讨论】:

  • 您想保留每第 N 行的某个 N 值吗?
  • 只保留每16行,可以直接使用awk 'NR%16 == 0' file.txt
  • a) 您使用了错误的工具,b) 显示一些示例输入和预期输出,以便我们帮助您以正确的方式进行操作。

标签: bash file sed process command


【解决方案1】:

试试这个:

mv file.txt file0.txt
for i in `seq 1 10`; do
    sed '1~2d' file$(($i-1)).txt > file$i.txt
done
mv file0.txt file.txt

它将生成 10 个名为 file1.txt、file2.txt 等的文件。这些文件中的每一个都在前一个文件上运行 sed 命令。

顺便说一句,$(()) 是 bash 算术评估。这就是与 1 相减的方法。

【讨论】:

  • 这看起来像我想要做的,但由于某种原因,在执行 .sh 时我没有得到不同的文件。无论如何都非常感谢你
  • 这对我来说非常好用。您可能想要做的是将上述代码中所有出现的file.txt 替换为您的文件名。
【解决方案2】:

听起来您需要的是(将 62 替换为您想要的任何数字):

awk '{for (i=2;i<=6;i+=2) if (!(NR%i)) print > ("file"i)}' file

例如在空目录中运行:

$ seq 1 20 | awk '{for (i=2;i<=6;i+=2) if (!(NR%i)) print > ("file"i)}'

$ lf
file2  file4  file6

$ cat file2
2
4
6
8
10
12
14
16
18
20

$ cat file4
4
8
12
16
20

$ cat file6
6
12
18

【讨论】:

    【解决方案3】:

    你可以反过来做:

    sed -n -i '16~16p' file.txt
    

    -n 选项抑制sed 在处理每一行后打印缓冲区的默认行为。 'p' 命令打印你想要的。

    -i 选项告诉sed“就地”处理命名文件,这实际上意味着它将管理创建一个临时文件,并在成功时用它替换原始文件。这比将输出直接重定向到sed 作为输入读取的文件要安全得多。

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2014-08-31
      相关资源
      最近更新 更多