如何在 cygwin 下使用 awk 打印 Excel 电子表格中的字段?

2024-01-18

我们似乎看到越来越多有关在 Excel 电子表格上执行 awk 的问题,因此这里有一个关于如何执行该特定操作的问答。

我在 Excel 电子表格中有此信息"$D/staff.xlsx" (where "$D"是我桌面的路径):

Name   Position
Sue    Manager
Bill   Secretary
Pat    Engineer

我想打印给定名称的位置字段,例如输出Secretary给定输入Bill.

我目前可以从 Excel 保存为 CSV 以获得:

$ cat "$D/staff.csv"
Name,Position
Sue,Manager
Bill,Secretary
Pat,Engineer

然后运行:

$ awk -F, -v name="Bill" '$1==name{print $2}' "$D/staff.csv"
Secretary

但这只是更大任务的一小部分,因此我必须能够从 shell 脚本自动执行此操作,而无需手动打开 Excel 导出 CSV 文件。如何在运行 cygwin 的 Windows PC 上执行此操作?


以下 VBS 和 shell 脚本的组合为 Excel 电子表格中的每个工作表创建一个 CSV 文件:

$ cat xls2csv.vbs
csv_format = 6

Dim strFilename
Dim objFSO
Set objFSO = CreateObject("scripting.filesystemobject")
strFilename = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If objFSO.fileexists(strFilename) Then
  Call Writefile(strFilename)
Else
  wscript.echo "no such file!"
End If
Set objFSO = Nothing

Sub Writefile(ByVal strFilename)
Dim objExcel
Dim objWB
Dim objws

Set objExcel = CreateObject("Excel.Application")
Set objWB = objExcel.Workbooks.Open(strFilename)

For Each objws In objWB.Sheets
  objws.Copy
  objExcel.ActiveWorkbook.SaveAs objWB.Path & "\" & objws.Name & ".csv", csv_format
  objExcel.ActiveWorkbook.Close False
Next

objWB.Close False
objExcel.Quit
Set objExcel = Nothing
End Sub

.

$ cat xls2csv
PATH="$HOME:$PATH"

# the original XLS input file path components
inXlsPath="$1"
inXlsDir=$(dirname "$inXlsPath")
xlsFile=$(basename "$inXlsPath")
xlsBase="${xlsFile%.*}"

# The tmp dir we'll copy the XLS to and run the tool on
# to get the CSVs generated
tmpXlsDir="/usr/tmp/${xlsBase}.$$"
tmpXlsPath="${tmpXlsDir}/${xlsFile}"
absXlsPath="C:/cygwin64/${tmpXlsPath}" # need an absolute path for VBS to work

mkdir -p "$tmpXlsDir"

trap 'rm -f "${tmpXlsDir}/${xlsFile}"; rmdir "$tmpXlsDir"; exit' 0

cp "$inXlsPath" "$tmpXlsDir"

cygstart "$HOME/xls2csv.vbs" "$absXlsPath"

printf "Waiting for \"${tmpXlsDir}/~\$${xlsFile}\" to be created:\n" >&2
while [ ! -f "${tmpXlsDir}/~\$${xlsFile}" ]
do
    # VBS is done when this tmp file is created and later removed
    printf "." >&2
    sleep 1
done
printf " Done.\n" >&2

printf "Waiting for \"${tmpXlsDir}/~\$${xlsFile}\" to be removed:\n" >&2
while [ -f "${tmpXlsDir}/~\$${xlsFile}" ]
do
    # VBS is done when this tmp file is removed
    printf "." >&2
    sleep 1
done
printf " Done.\n" >&2

numFiles=0
for file in "$tmpXlsDir"/*.csv
do
    numFiles=$(( numFiles + 1 ))
done

if (( numFiles >= 1 ))
then
    outCsvDir="${inXlsDir}/${xlsBase}.csvs"
    mkdir -p "$outCsvDir"
    mv "$tmpXlsDir"/*.csv "$outCsvDir"
fi

现在我们执行 shell 脚本,该脚本内部调用 cygstart 运行 VBS 脚本,在 Excel 文件所在目录下的子目录中生成 CSV 文件(每张一个),该子目录根据 Excel 文件名命名(例如 Excel 文件)staff.xlsx生成 CSV 目录staff.csvs):

$ ./xls2csv "$D/staff.xlsx"
Waiting for "/usr/tmp/staff.2700/~$staff.xlsx" to be created:
.. Done.
Waiting for "/usr/tmp/staff.2700/~$staff.xlsx" to be removed:
. Done.

只有一张具有默认名称的工作表Sheet1在目标 Excel 文件中"$D/staff.xlsx"所以上面的输出是一个文件"$D/staff.csvs/Sheet1.csv":

$ cat "$D/staff.csvs/Sheet1.csv"
Name,Position
Sue,Manager
Bill,Secretary
Pat,Engineer

$ awk -F, -v name="Bill" '$1==name{print $2}' "$D/staff.csvs/Sheet1.csv"
Secretary

另请参阅使用 awk 有效解析 CSV 的最可靠方法是什么? https://stackoverflow.com/q/45420535/1745001了解如何操作这些 CSV。

也可以看看https://stackoverflow.com/a/58879683/1745001 https://stackoverflow.com/a/58879683/1745001了解如何执行相反的操作,即从 Windows 批处理文件调用 cygwin bash 命令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 cygwin 下使用 awk 打印 Excel 电子表格中的字段? 的相关文章

  • 使用宏打开受信任文档或启用宏时 Excel 崩溃

    正如标题所示 我无法使用宏打开受信任的文档 Excel 立即崩溃 制作文档的副本允许其打开 因为该副本不受信任 并且我可以检查 VB 编辑器中的宏 但启用宏会导致另一次崩溃 为什么会发生这种情况以及我可以采取什么措施来解决它 我今天遇到了类
  • Powershell - 在不安装 Excel 的情况下将 CSV 转换为 XLS

    我有一台自动生成报告的服务器 报告采用 CSV 格式 我需要能够直接加密文件 无需第三方压缩 无 WinZIP 或 WinRAR 我认为最好的想法是将 CSV 转换为 XLS 然后通过 Powershell 密码保护 XLS 文件 不幸的是
  • 使用 ASP 将参数传递给存储过程

    我正在尝试将一些参数传递给经典 ASP 中的 SQL 存储过程 我看过几篇关于此的帖子 不确定我做错了什么 因为我似乎没有看到我的差异 set conn CreateObject ADODB Connection conn open DSN
  • 跳过行:将数据从 SSIS 导出到 Excel 文件

    我正在尝试使用 SSIS 将数据从 SQL Server 数据库导出到 Excel 文件中 我希望从第 6 行插入数据 第 5 行有标题 我可以映射标题名称Excel 目标编辑器 通过编写 SQL 命令到 SQL 表头 SELECT FRO
  • C# 将数据写入 CSV 文件

    我正在尝试写入csv使用 C 语言逐行文件 这是我的功能 string first reader 0 ToString string second image ToString string csv string Format 0 1 n
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 对重复的名称添加双引号

    我想从文件中找到重复的名称 如下所示 并用 标记它们 file James Miki 123 456 7890 Wang Tai 234 563 6879 James Miki 123 456 7890 输出希望看起来像 James Mik
  • 折叠具有多个字段的行

    我有这个代码 awk seen 1 2 a 1 a 1 a 1 t 2 END for i in a print i a i inputfile 我想折叠具有两个以上字段的行 但始终基于第一个字段作为索引 输入文件 三列制表符分隔 prot
  • 在 powershell 中打开 Excel 时出错

    我需要用以下命令打开 Excel 文件CorruptLoad来自 powershell 脚本的参数 但是当我尝试做到这一点时 出现错误Exception calling Open with 15 argument s open method
  • Excel 2010 在 IF 函数中搜索文本 - 单独的单元格数据

    Program Excel 2010 Require 一种将名字 姓氏 电子邮件提取到各个单元格的方法 Data 我的数据有一个包含原始 脏数据 的表 它是原始的并且一团糟 我用一个简单的方法整理它 IF A7 Order 1 然后其余单元
  • 如何修复日期过滤器 VBA,因为它没有拾取我范围内的所有日期

    我正在尝试创建一个过滤器来过滤掉我选择的日期内的所有日期 我选择的日期将始终反映整个月 例如 如果我需要 2019 年 5 月的数据 我将输入开始日期为 01 05 2019 结束日期为 31 05 2019 我的数据过滤器将需要选取经过我
  • 在 Excel 中打开文件而不重新计算 NOW()

    在 Excel 2010 2011 和 2013 尝试了所有三个 中 以只读方式打开文件仍然会重新计算 NOW 有没有办法让excel在打开文件时不重新计算 最简单的方法是将自动 默认 计算选项切换为手动 update 首先打开一个空白的新
  • 将单元格内的任何单词与单元格范围内的任何单词相匹配

    我有一个短语列表 我想检查是否有任何新术语与该列表部分单词匹配 我正在寻找一个代码来在列表上实现模糊匹配 以返回具有紧密匹配的单元格 示例数据 Phrases Terms real term new words great work new
  • 如何在 Excel 中创建 GUID?

    我需要一个函数来将 GUID 添加到 Excel 中的单元格 我发现stackoverflow 上的上一个问题 https stackoverflow com questions 7031347 how can i generate gui
  • 将 Excel 数字日期重新格式化为 R 日期

    希望将从 Excel 中提取的列重新格式化为包含数字 Excel 格式 例如 40182 的数据框 as date 40182 origin 1899 12 30 format b Y Returns 1 2070 年 1 月 5 日 我正
  • 如何在 Python 2.7 中编写 unicode csv

    我想将数据写入文件 其中 CSV 中的行应如下所示 直接来自 Python 控制台 row xef xbb xbft 11651497 http kozbeszerzes ceu hu entity t 11651497 xml Szabo
  • Excel 公式转 SUMIF 日期属于特定月份

    我有以下格式的 Excel 数据 Date Amount 03 Jan 13 430 00 25 Jan 13 96 00 10 Jan 13 440 00 28 Feb 13 72 10 28 Feb 13 72 30 仅当月份位于时 我
  • VBA在下一个空白行正确输入用户表单数据

    创建了一个用户表单 添加了一个文本框和一个组合框 添加了提交按钮 单击 提交 后 会将数据添加到电子表格中 据我所知和我所读到的 这是错误的 ActiveCell Value TextBox3 Text ActiveCell Offset
  • 根据用户名获取广告详细信息

    我有一个代码可以从 AD 检索用户的详细信息 例如电子邮件地址 电话号码等 我当前使用的代码是 Set objSysInfo CreateObject ADSystemInfo strUser objSysInfo UserName msg
  • 如何将 Excel 或 CSV 文件加载到 Firebird 中?

    我在用着Firebird http www firebirdsql org数据库 我需要将 Excel 文件加载到数据库表中 我需要一个能很好地完成这项工作的工具 我尝试了一些在谷歌上找到的东西 但它们都有一些错误 由于 Excel 数据不

随机推荐