AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 728390
Accepted
ThePresident
ThePresident
Asked: 2022-12-14 19:50:59 +0800 CST2022-12-14 19:50:59 +0800 CST 2022-12-14 19:50:59 +0800 CST

目录中的 Feed 功能特定文件

  • 772

我需要为程序提供一些特定文件,以正确的顺序并两两分组。

如果我有

A_file.txt
B_file.txt
C_file.txt
D_file.txt

我需要将它提供给一个程序,以便首先处理文件 A 和 B,然后是 C 和 D,依此类推。在本质上:

for i in *.txt; do 
   some_program A_file.txt B_file.txt > output_AB
   some_program C_file.txt D_file.txt > output_CD

我知道以上没有意义,但它是为了说明这一点。本质上,遍历.txt文件夹中的所有文件,但将它们一次提供给程序两个,然后移至下两个。

正在学习,非常感谢。

bash
  • 4 4 个回答
  • 439 Views

4 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2022-12-14T23:03:04+08:002022-12-14T23:03:04+08:00
    #!/bin/sh
    
    set -- *_file.txt
    
    until [ "$#" -lt 2 ]; do
        process "$1" "$2" >"output_${1%_file.txt}${2%_file.txt}"
        shift 2
    done
    

    这会将位置参数设置为您感兴趣的文件名列表,基于与问题中的名称匹配的文件名通配模式。然后它使用循环迭代此列表,直到列表中剩下的名字少于两个($#是位置参数列表的长度)。

    在每次迭代中,处理列表的前两个元素$1和$2,然后使用 将其移出列表shift 2。

    处理的输出被重定向到一个名为的文件,output_后跟两个文件名的可变部分的串联(无论_file.txt每个文件中的静态字符串之前是什么)。

    这假定文件的命名方式是按字典顺序对名称进行排序(通配模式的扩展将执行此操作)会生成一个名称列表,这些名称可以按照问题中显示的方式进行配对。

    • 7
  2. larsks
    2022-12-14T20:26:48+08:002022-12-14T20:26:48+08:00

    您可以使用xargs命令执行此操作。如果我有这些文件:

    $ ls
    A_file.txt  B_file.txt  C_file.txt  D_file.txt  E_file.txt  F_file.txt  G_file.txt  H_file.txt
    

    然后我可以像这样一次处理这两个:

    $ find . -type f | xargs -n2 echo some_program
    some_program ./A_file.txt ./B_file.txt
    some_program ./C_file.txt ./D_file.txt
    some_program ./E_file.txt ./F_file.txt
    some_program ./G_file.txt ./H_file.txt
    

    在这里,我只是调用echo,但您当然可以删除echo并实际运行some_program。这将一次处理两个文件......但它不处理为每次调用生成输出文件名。

    如果我们做得更详细一点,我们可以输出到一个以第一个输入文件名命名的文件:

    find . -type f | xargs -n2 sh -c 'echo some_program $1 $2 > $1.output' --
    

    这将为A_file.txt.output和A_file.txt、B_file.txt下一C_File.txt.output对等生成文件。您可以通过应用各种转换来更好地了解输出文件名;例如,要获取您在问题中要求的文件名,您可以这样写:

    find . -type f | xargs -n2 sh -c 'echo some_program $1 $2 > output_${1:2:1}${2:2:1}' --
    

    这将生成输出文件名output_AB,output_CD等等。

    • 6
  3. Stéphane Chazelas
    2022-12-14T23:39:44+08:002022-12-14T23:39:44+08:00

    如果从 bash 切换到 zsh 是一种选择,那么它只是:

    for i j ( *.txt(N) ) some_program -- $i $j > output_$i[1]$j[1]
    

    (N)从那个 glob 扩展中启用 nullglob,以便在没有匹配项时不报告错误。

    如果文件数量为奇数,则最后一次运行将$j设置为空字符串。当我们在 argument to 中不加引号时some_program,这将导致没有相应的参数传递给它。"$j"在这种情况下,如果您希望将空参数传递给它,请替换为。

    *.txt扩展将按字母顺序排列;o您可以使用,O和/或n glob 限定符将顺序更改为您想要的任何顺序。

    对于每次迭代的任意数量的文件,而不是仅仅 2 个:

    files=( *.txt(N) ) n=5
    while (( $#files )) {
      some_program -- $files[1,n] > output_${(Mj[])files[1,n]#?}
      files[1,5]=()
    }
    

    或使用zargs:

    autoload -Uz zargs
    process() some_program -- $@ > output_${(Mj[])@#?}
    zargs -rl5 -- *.txt(N) -- process
    

    在${(Mj[])array#?},${array#?}中将从数组的每个元素中去除前导字符,但在 中M,返回的是Matched 的内容。结果是j空的 ( []),所以你得到一个由每个元素的第一个字符组成的字符串。

    • 5
  4. White Owl
    2022-12-14T20:23:24+08:002022-12-14T20:23:24+08:00

    将文件列表转储到数组中并从中读取。

    #!/bin/bash
    arr=( *.txt )
    i=0
    while [ $i -lt ${#arr[@]} ];
    do
      echo ${arr[$i]} ${arr[ $[$i+1] ]}
      i=$[$i+2]
    done
    

    如果你有奇数个文件,请求${arr[ $[$i+1] ]}会默默地给你一个空字符串。由您决定在这种情况下要做什么。

    • 2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve