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
    • 最新
    • 标签
主页 / coding / 问题 / 76981464
Accepted
echo
echo
Asked: 2023-08-26 11:36:39 +0800 CST2023-08-26 11:36:39 +0800 CST 2023-08-26 11:36:39 +0800 CST

将文件每一行的后半部分替换为另一个文件中相应行的后半部分[关闭]

  • 772
关闭。这个问题需要更加有针对性。目前不接受答案。

想要改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

2 天前关闭。

改进这个问题

我有两个文件 A 和 B。两个文件中的每一行都被视为一个项目。每个项目的格式都是固定的,由键和描述组成,并用空格分隔。如下例所示。

UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark

第一部分UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104是关键,最后一部分/users/documents/ark是描述。文件 A 和 B 分别有 1000 和 100000 个项目。在我们的示例中,每个键都可以分为两部分:索引(例如:UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2)和时间戳(例如:0000027_0000104)。时间戳中的数字没有任何规则。索引和时间戳之间的字符固定为_。每个键都是唯一的,每个索引在同一个文件中也是唯一的。文件 A 中包含的每个索引也出现在文件 B 中,并且具有不同的时间戳。如下一个简单的例子所示。

文件A

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark2

文件B

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark3
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark4
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

我想将文件B中相同索引对应的描述替换为文件A中索引对应的描述。示例中的结果如下所示。

文件B

UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5

如何实现这个目标?

awk
  • 4 4 个回答
  • 30 Views

4 个回答

  • Voted
  1. potong
    2023-08-26T14:49:58+08:002023-08-26T14:49:58+08:00

    这可能对你有用(GNU sed):

    sed -E 's|([^_]*_).*( .*)|/^\1/s# .*#\2#|' fileA | sed -f - fileB
    

    从 fileA 构建 sed 脚本以应用于 fileB。

    fileA 中的每一行都被转换为匹配和替换。索引用作匹配,其描述用于替换,然后应用于 fileB。匹配的行将具有 fileA 中的描述。

    注意:在两个替换命令中使用备用分隔符。如果描述可能包含该#字符,则使用任何描述中都不存在的另一个字符作为分隔符。

    • 3
  2. Kaz
    2023-08-26T12:43:50+08:002023-08-26T12:43:50+08:00

    TXR Lisp中的解决方案:

    $ txr subst.tl filea fileb
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
    

    代码:

    (tree-bind (filea fileb) *args*
      (let ((h (hash)))
        (with-stream (s (open-file filea))
          (whilet ((line (get-line s)))
            (match `@a-@{b}_@{c}_@d @path` line
              (set [h `@a-@b-@c`] path))))
        (with-stream (s (open-file fileb))
          (whilet ((line (get-line s)))
            (match `@a-@{b}_@{c}_@d @path` line
              (put-line `@a-@{b}_@{c}_@d @(or [h `@a-@b-@c`] path)`))))))
    

    或者,使用awk宏来扫描文件;但除此之外同样的方法:

    (awk
      (:let (h (hash)))
      ((= fnr nr)
       (match `@a-@{b}_@{c}_@d @path` rec
         (set [h `@a-@b-@c`] path))
       (next))
      ((match `@a-@{b}_@{c}_@d @path` rec
        (prn `@a-@{b}_@{c}_@d @(or [h `@a-@b-@c`] path)`))))
    
    • 1
  3. Best Answer
    ufopilot
    2023-08-26T15:06:30+08:002023-08-26T15:06:30+08:00
    awk '
        NR==FNR{
            split($1,p,"_")
            a[p[1]"_"p[2]] = $NF
            next
        } 
        split($1,b,"_") && (b[1]"_"b[2] in a){ 
            $NF = a[b[1]"_"b[2]]
        }1
    ' FileA FileB
    
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
    
    • 1
  4. Ed Morton
    2023-08-26T20:46:37+08:002023-08-26T20:46:37+08:00

    使用任何 awk:

    $ cat tst.awk
    { key = substr($1,1,length($1)-16) }
    NR == FNR {
        sub(/[^ ]+/,"")
        map[key] = $0
        next
    }
    key in map {
        $0 = $1 map[key]
    }
    { print }
    

    $ awk -f tst.awk FileA FileB
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
    

    即使您的任何“描述”包含空格,上述内容也将起作用,例如给出以下输入:

    $ head File[AB]
    ==> FileA <==
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/saved documents/this    is     interesting ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/saved documents/ark2
    
    ==> FileB <==
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/saved documents/ark3
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/saved documents/and    so     is   this   ark4
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/saved documents/and   this   too  ark5
    

    我们仍然得到所需的输出:

    $ awk -f tst.awk FileA FileB
    UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/saved documents/this    is     interesting ark1
    UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/saved documents/ark2
    UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/saved documents/and   this   too  ark5
    
    • 1

相关问题

Sidebar

Stats

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

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve