使用Bash写入Excel表格

是否有可能写入一个Excel表(任何types)从一个bash脚本?

我正在寻找的东西是这样的:

sed -e :a -e '$!N; s/\n/ /; ta' file.c > #( first coloumn ,second row of the spread sheet ) echo "$cdvar" > #( second coloumn ,third row of the spread sheet ) 

感谢您的回复和build议。

你可以用bashperlpython编写excel。我认为每种程序语言都有它的解决scheme。

庆典

你可以使用joinawk ,我认为还有其他的解决scheme。

join

如果你想join到同一列的文件,看看这些post: Bashjoin命令,并像在SAS中joinbash

AWK

你可以写一个csv,但你可以renamexls ,然后用excel,gnumeric或其他程序,它被认为是xls。

 ls -R -ltr / | head -50 | awk '{if ($5 >0) print $5,$9}' OFS="," > sample.xls 

当你用excel,gnumeric或其他程序修改xls,并保存在xls中时,你无法通过bash读取。 所以@Geekasaur推荐perlpython解决scheme。

perl的

你可以在Perl中写xls ,按照下面的例子 :

 #!/usr/bin/perl use Spreadsheet::WriteExcel; my $workbook = Spreadsheet::WriteExcel->new("test.xls"); my $worksheet = $workbook->add_worksheet(); open(FH,"<file") or die "Cannot open file: $!\n"; my ($x,$y) = (0,0); while (<FH>){ chomp; @list = split /\s+/,$_; foreach my $c (@list){ $worksheet->write($x, $y++, $c); } $x++;$y=0; } close(FH); $workbook->close(); 

然后你可以用Spreadsheet::ParseExcel包来修改xls :看看如何用Perl修改现有的Excel工作簿? 阅读和写作样本

python

你可以用python编写真正的xls ,请按照下面的示例进行操作 :

 #!/usr/local/bin/python # Tool to convert CSV files (with configurable delimiter and text wrap # character) to Excel spreadsheets. import string import sys import getopt import re import os import os.path import csv from pyExcelerator import * def usage(): """ Display the usage """ print "Usage:" + sys.argv[0] + " [OPTIONS] csvfile" print "OPTIONS:" print "--title|-t: If set, the first line is the title line" print "--lines|-ln: Split output into files of n lines or less each" print "--sep|-sc [def:,] : The character to use for field delimiter" print "--output|o : output file name/pattern" print "--help|h : print this information" sys.exit(2) def openExcelSheet(outputFileName): """ Opens a reference to an Excel WorkBook and Worksheet objects """ workbook = Workbook() worksheet = workbook.add_sheet("Sheet 1") return workbook, worksheet def writeExcelHeader(worksheet, titleCols): """ Write the header line into the worksheet """ cno = 0 for titleCol in titleCols: worksheet.write(0, cno, titleCol) cno = cno + 1 def writeExcelRow(worksheet, lno, columns): """ Write a non-header row into the worksheet """ cno = 0 for column in columns: worksheet.write(lno, cno, column) cno = cno + 1 def closeExcelSheet(workbook, outputFileName): """ Saves the in-memory WorkBook object into the specified file """ workbook.save(outputFileName) def getDefaultOutputFileName(inputFileName): """ Returns the name of the default output file based on the value of the input file. The default output file is always created in the current working directory. This can be overriden using the -o or --output option to explicitly specify an output file """ baseName = os.path.basename(inputFileName) rootName = os.path.splitext(baseName)[0] return string.join([rootName, "xls"], '.') def renameOutputFile(outputFileName, fno): """ Renames the output file name by appending the current file number to it """ dirName, baseName = os.path.split(outputFileName) rootName, extName = os.path.splitext(baseName) backupFileBaseName = string.join([string.join([rootName, str(fno)], '-'), extName], '') backupFileName = os.path.join(dirName, backupFileBaseName) try: os.rename(outputFileName, backupFileName) except OSError: print "Error renaming output file:", outputFileName, "to", backupFileName, "...aborting" sys.exit(-1) def validateOpts(opts): """ Returns option values specified, or the default if none """ titlePresent = False linesPerFile = -1 outputFileName = "" sepChar = "," for option, argval in opts: if (option in ("-t", "--title")): titlePresent = True if (option in ("-l", "--lines")): linesPerFile = int(argval) if (option in ("-s", "--sep")): sepChar = argval if (option in ("-o", "--output")): outputFileName = argval if (option in ("-h", "--help")): usage() return titlePresent, linesPerFile, sepChar, outputFileName def main(): """ This is how we are called """ try: opts,args = getopt.getopt(sys.argv[1:], "tl:s:o:h", ["title", "lines=", "sep=", "output=", "help"]) except getopt.GetoptError: usage() if (len(args) != 1): usage() inputFileName = args[0] try: inputFile = open(inputFileName, 'r') except IOError: print "File not found:", inputFileName, "...aborting" sys.exit(-1) titlePresent, linesPerFile, sepChar, outputFileName = validateOpts(opts) if (outputFileName == ""): outputFileName = getDefaultOutputFileName(inputFileName) workbook, worksheet = openExcelSheet(outputFileName) fno = 0 lno = 0 titleCols = [] reader = csv.reader(inputFile, delimiter=sepChar) for line in reader: if (lno == 0 and titlePresent): if (len(titleCols) == 0): titleCols = line writeExcelHeader(worksheet, titleCols) else: writeExcelRow(worksheet, lno, line) lno = lno + 1 if (linesPerFile != -1 and lno >= linesPerFile): closeExcelSheet(workbook, outputFileName) renameOutputFile(outputFileName, fno) fno = fno + 1 lno = 0 workbook, worksheet = openExcelSheet(outputFileName) inputFile.close() closeExcelSheet(workbook, outputFileName) if (fno > 0): renameOutputFile(outputFileName, fno) if __name__ == "__main__": main() 

然后你也可以用这个sourceforge项目 convert成csv。 如果你可以转换成csv,你可以重写xls ..修改脚本。

您可以通过首先创build一个R脚本(xsltocsv),然后从您的Bash文件中调用它来轻松完成此操作。

R脚本看起来像这样:

 #!/usr/bin/Rscript suppressMessages(library("gdata")) suppressMessages(library("argparse")) #. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . parser <- ArgumentParser( description = "A script to convert a given xsl file to a csv one" ) parser$add_argument( '-rn', '--print-row-names', action = 'store_true', help = 'outputs row names in the output csv file' ) parser$add_argument( '-cn', '--print-column-names', action = 'store_true', help = 'outputs column names in the output csv file' ) parser$add_argument( '-s', '--separator', metavar='separator', type='character', default=';', action = 'store', help = 'outputs column names in the output csv file' ) parser$add_argument( "xsl", metavar = "xsl-file", action = "store", help = "xsl input file" ) parser$add_argument( "csv", metavar = "csv-file", action = "store", help = "csv output file" ) args <- parser$parse_args(commandArgs(TRUE)) #. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vals <- read.xls(args$xsl) write.table(n, file=args$csv, quote = FALSE, col.names=args$print_column_names, row.names=args$print_row_names, sep=args$separator) 

让我们说,在将文件设置为可执行文件( chmod +x xsltocsv )后,将其放入系统path中。 然后,调用这个脚本通过相关的参数,你很好去;)