3

我已经编写了一个简单的脚本作为我awk/sed要求的高级工具。在脚本中,我根据查询文件的一列中的值比较两个文件,然后从主文件中提取整个条目。该脚本允许您为每个文件输入列值和分隔符。

问题是从命令行给出时脚本无法识别“分隔符”选项。

这是我的代码(部分):

##- - - - - - - -- - - - - - Arguments - - - - - - - - - - - - - -##
parser = argparse.ArgumentParser()

## Command line options
parser.add_argument("-m",  "--master",     dest="master", help="master file")
parser.add_argument("-q",  "--query",      dest="query",  help="queries to be extracted")
parser.add_argument("-d",  "--delimiter",  dest="delimiter",  default='\t', help="delimiter in master")
parser.add_argument("-p",  "--position",   dest="position",   default='1',  help="position/column of value in master")
parser.add_argument("-d2", "--delimiter2", dest="delimiter2", default='\t', help="delimiter in query")
parser.add_argument("-p2", "--position2",  dest="position2",  default='1',  help="position/column of value in query")

args = parser.parse_args()

def Extractor(master, query):

    out_file = ('%s_matched_%s' % (query,master))
    fh_out = open(out_file, 'w')

    query_set = () ## To unique query set
    for i in query:
        key = i.split('args.delimiter2')[int(args.position2)] ## Key is the value on which matching will be done
        query_set.add(key)

如您所见,我从命令行获取“查询文件”分隔符的选项,并通过在脚本中使用它们argparse,但这不起作用。仅当我在脚本中明确提及分隔符时才有效,例如:

key = i.split('\t')[args.position2] ## Key is the value on which matching will be done

我给出的命令行选项是:

$ py3 ExtractHeaders_v01.py -m ABC.csv -q XYZ.list -d2 \t -d , -p 1 -p2 0

在哪里

  • ABC.csv是从中提取条目的主文件。
    • 第二列将用于匹配 ( -p 1)
    • 它的分隔符是逗号 ( -d ,)
  • XYZ.list是查询文件。
    • 第一列将用于匹配 ( -p2 0)
    • 它的分隔符是制表符 ( -d2 \t)

请帮助我理解为什么从命令行给出分隔符时脚本不使用分隔符。

4

2 回答 2

2

您的 shell 正在解释\t命令行中的 ,而传递给 Python 的内容很可能是单个t. 尝试\\t'\t'将文字的两个字符转义序列放入argv. 然后你需要在 Python 中取消转义这个字符串:

delimiter = delimiter.decode("string-escape") 
于 2012-09-08T22:34:34.623 回答
1

您也可以Tab在 *nix shell(例如 bash)中传递字符,方法是按下Ctrl+V后跟Tab引号(单引号或双引号),即键入" Ctrl+V Tab ".

于 2012-09-08T22:38:48.597 回答