【问题标题】:split and write the files with AWK -Bash使用 AWK -Bash 拆分和写入文件
【发布时间】:2022-01-07 19:44:41
【问题描述】:

INPUT_FILE.txt in c:\Pro\usr\folder1

ABCDEFGH123456
ABCDEFGH123456
ABCDEFGH123456
BBCDEFGH123456
BBCDEFGH123456

在从c:\Pro\usr\folder2 运行的.SH 脚本中使用下面的AWK 命令,根据第一个8 字符将文件拆分为多个扩展名为_kg 的txt 文件。

awk '{ F=substr($0,1,8) "_kg" ".txt"; print $0 >> F; close(F) }'  ' "c:\Pro\usr\folder1\input_file.txt" 

这很好用,但是文件正在写入 bash 指向的主要位置。如何将创建的文件路由到另一个位置,例如 c:\Pro\usr\folder3

谢谢

【问题讨论】:

  • 在分配路径时将路径作为F 变量的一部分(或在执行打印时连接路径。
  • 您发布的脚本无法正常运行,因为它包含会产生语法错误的无关 '。此外,在 linux 上,\f 表示换页符,因此使用"c:\Pro\usr\folder1\input_file.txt" 之类的路径无法为您工作。如果您的意思是"c:/Pro/usr/folder1/input_file.txt" 或类似名称,请edit 您的问题显示正确的路径。

标签: linux bash awk


【解决方案1】:

遵循awk 代码可能会帮助您在GNU awk 中使用所示示例编写和测试。

awk -v outPath='c:\\Pro\\usr\\folder3' -v FPAT='^.{8}' '{outFile=($1"_kg.txt");outFile=outPath"\\"outFile;print > (outFile);close(outFile)}' Input_file

解释: 创建一个名为outPathawk 变量,该变量具有OP 在示例中提到的路径。然后设置FPAT(字段分隔符设置为正则表达式),我正在创建从第一个字符开始的8个字符的字段。在awk的主程序中,创建outFile变量,其中包含输出文件名(第一个字段后跟_kg.txt),然后将整行打印到输出文件并在后端关闭输出文件以避免“打开太多文件”错误。

【讨论】:

  • 嘿嘿……干得好。 POSIX 分隔符等等。
  • 感谢完美的解决方案。我有更多的要求,我需要从第 9 个位置写入记录,我使用了下面的(因为我知道最大记录长度为 24000)。awk -v outPath='c:\\Pro\\usr\ \folder3' -v FPAT='^.{8}' '{outFile=($1"_kg.txt");outFile=outPath"\\"outFile;print substr($0,9,23992) > (outFile);关闭(outFile)}' Input_file 。有没有更好的选择来避免长度的硬编码?
  • @Krispy,欢迎您。您可以在awk 中创建一个变量,然后您可以用该变量代替 substr 中的变量值,这样您就不需要更改整个代码,只需更改变量值。
【解决方案2】:

将目标文件夹作为变量传递给 awk:

awk -v dest='c:\\Pro\\usr\\folder3\\' '{F=dest substr($0,1,8) "_kg" ".txt"; print $0 >> F; close(F) }' "c:\Pro\usr\folder1\input_file.txt" 

我认为双反斜杠是必需的。

【讨论】:

  • C:/Pro/usr/folder3/ 应该也可以工作。
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2011-10-09
  • 2015-04-20
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 2012-07-11
相关资源
最近更新 更多