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 / 问题 / 76978240
Accepted
JVGen
JVGen
Asked: 2023-08-25 22:44:36 +0800 CST2023-08-25 22:44:36 +0800 CST 2023-08-25 22:44:36 +0800 CST

Linux 中大型 TSV 的条件编辑

  • 772

我有许多大型 TSV 文件,其中有 6 个未命名列和大约 1000 万行。我需要逐行应用更改并保存为新的 TSV。我正在Linux上工作,可以使用 awk、gawk、grep。理想情况下,代码将在其运算符中引用列号,这样无论行内容如何,​​它都能正常运行。蒂亚!

唯一需要更改的是第 2 列和第 3 列,但更改取决于第 6 列中的值:

If the value of column 6 is "+", then:  
New Column 2: [Column 2 Value]  
New Column 3: [Column 2 Value] + 1  
  
If the value of column 6 is "-", then:  
New Column 2: [Column 3 Value] - 1  
New Column 3: [Column 3 Value]  

TSV 数据结构示例(实际数据中不存在 | 存在)

| AI     | 828     | 878     | ABC4807:78485:5:79215       | 42 | - |
| AI     | 971     | 1021    | ABC248:78485:5:79215:46065  | 42 | + |
| AI     | 1104    | 1153    | X7481:78485:5:79215:40174   | 35 | - |
| XVDIII | 56939   | 56988   | 9478:78485:5:79215:30872    | 42 | - |
| XVDIII | 56971   | 57020   | 7841S:78485:5:79215:34301   | 42 | - |
| UTXV   | 1043196 | 1043246 | T885189:78485:5:79215:10036 | 42 | + |
| UTXV   | 1043198 | 1043248 | C74581:78485:5:79215:10792  | 42 | - |
| UTXV   | 1043201 | 1043250 | T75S17:78485:5:79215:30204  | 42 | - |
| UTXV   | 1043201 | 1043251 | B784W7:78485:5:79215:42548  | 42 | - |

所需的 TSV 输出

| AI     | 877     | 878     | ABC4807:78485:5:79215       | 42 | - |
| AI     | 971     | 972     | ABC248:78485:5:79215:46065  | 42 | + |
| AI     | 1152    | 1153    | X7481:78485:5:79215:40174   | 35 | - |
| XVDIII | 56987   | 56988   | 9478:78485:5:79215:30872    | 42 | - |
| XVDIII | 57019   | 57020   | 7841S:78485:5:79215:34301   | 42 | - |
| UTXV   | 1043196 | 1043197 | T885189:78485:5:79215:10036 | 42 | + |
| UTXV   | 1043247 | 1043248 | C74581:78485:5:79215:10792  | 42 | - |
| UTXV   | 1043249 | 1043250 | T75S17:78485:5:79215:30204  | 42 | - |
| UTXV   | 1043250 | 1043251 | B784W7:78485:5:79215:42548  | 42 | - |
linux
  • 2 2 个回答
  • 34 Views

2 个回答

  • Voted
  1. Best Answer
    dodrg
    2023-08-26T00:21:46+08:002023-08-26T00:21:46+08:00

    替换值的算法不是问题。有趣的一点是保持固定宽度的列。

    文件: dataconvert.awk

    #!/usr/bin/gawk -f
    
    BEGIN {
        OFS = FS = "|"
    }
    {
        if ($7 ~ /+/) {
            len = length($4)
            $4 = $3
            gsub(/\s+/, "", $4)
            $4 = substr((" " ($4 + 1) "                       "), 0, len)
        } else {
            if ($7 ~ /-/) {
                len = length($3)
                $3 = $4
                gsub(/\s+/, "", $3)
                $3 = substr((" " ($3 - 1) "                       "), 0, len)
            }
        } 
        print
    }
    

    将其标记为可执行chmod +x dataconvert.awk文件,您可以直接调用./dataconvert.awk

    在此解决方案中,存储列内容的宽度,结果填充少量空格,最后裁剪为存储的长度。

    +如果数据集确实在提供值或第 6 列中没有异常,则可以省略-第二个子句。if对于巨大的数据集,这可以节省一些时间。

    由于数据集以字段分隔符开头,因此第一列始终为空但存在。所以列数必须+1以直观的方式来计数。

    • 1
  2. JVGen
    2023-08-26T02:50:45+08:002023-08-26T02:50:45+08:00

    我调整了 dodrg 的响应以适应我的数据结构。我已接受他们的答案,但想将此回复发布给将来可能遇到此问题的任何人。

    awk ' BEGIN { FS = OFS = "\t" }
    {
      if ($6 == "+") {
        $2 = $2
        $3 = $2 + 1
      } else {
        if ($6 == "-") {
          $2 = $3 - 1
          $3 = $3
        }
      } 
      print
    }'  filein.tsv > fileout.tsv
    
    • 0

相关问题

  • 计算与文件第一列相对应的第二列中的字符串出现次数[关闭]

  • 在 Linux 中从磁盘映像文件中提取输出值作为字符串[关闭]

  • 需要帮助通过 bsub 在 Windows 命令行上运行涉及多个单引号和双引号的命令

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