将递增标识列添加到文件中

将递增标识列添加到文件中

两个问题:

1)有没有办法为包含数据的现有文件创建新列(即ID),并将新列ID填充为自动递增数字?

例如:(
当前文件有标题,并且是 PIPE 分隔的。)

数据看起来像这样

"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

希望它像

"ID"|"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

2)有没有办法用包含数据的现有文件的新列替换现有列。新列将是“ID”并填充为自动递增数字?

例如:(
当前文件有标题,并且是 PIPE 分隔的。)

数据看起来像这样

"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

希望它像

"COL1"|"COL2"|"ID"|"COL4"|"COL5"
"A1"|"B1"|"1"|"D1"|"E1"
"A2"|"B2"|"2"|"D2"|"E2"
"A3"|"B3"|"3"|"D3"|"E3"

答案1

$ cat file
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

1)

$ awk '{printf "\"%s\"|%s\n", NR==1 ? "ID" : NR-1, $0}' file
"ID"|"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

2)重新排列 1) 的输出

$ awk '{printf "\"%s\"|%s\n", NR==1 ? "ID" : NR-1, $0}' file |\
    awk 'BEGIN{FS=OFS="|"} {print $2,$3,$1,$4,$5,$6}'
"COL1"|"COL2"|ID|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"C1"|"D1"|"E1"
"A2"|"B2"|"2"|"C2"|"D2"|"E2"
"A3"|"B3"|"3"|"C3"|"D3"|"E3"

2)或者直接 awk

$ awk 'BEGIN{FS=OFS="|"} {print $1,$2,NR==1 ? "ID" : "\""NR-1"\"",$3,$4,$5}' file
"COL1"|"COL2"|ID|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"C1"|"D1"|"E1"
"A2"|"B2"|"2"|"C2"|"D2"|"E2"
"A3"|"B3"|"3"|"C3"|"D3"|"E3"

答案2

尽管您用 awk 和 sed 标记了这个问题,但 python 也可以同样出色地完成同样的工作。下面的脚本有两个函数来解决您的每个问题。根据需要注释/取消注释它们。请注意,该脚本将输入文件作为命令行上的第一个位置参数并写入临时文件。取消注释函数中的最后一行main以实际编辑原始文件。

脚本源

#!/usr/bin/env python
import sys
import os

def prepend_column(input,output):
    for index,line in enumerate(input):
        if index == 0:
            output.write(line)
            continue
        output.write('"' + str(index) +'"|' + line)

def alter_column(input,output):
    for index,line in enumerate(input):
        if index == 0: 
            output.write(line)
            continue
        vals = line.split('|')
        vals[2] = '"' + str(index) + '"'
        output.write('|'.join(vals))

def main():
    temp = '/tmp/temp_text'
    with open(sys.argv[1]) as f:
         with open(temp,'w') as t:
            # alter_column(f,t)
            prepend_column(f,t)
    # uncomment line below to actually replace original file
    # os.rename(temp,sys.argv)

if __name__ == '__main__': main()

演示。

追加栏目:

bash-4.3$ python process_columns.py data.txt 
bash-4.3$ cat /tmp/temp_text
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

更改列:

bash-4.3$ python process_columns.py data.txt 
bash-4.3$ cat /tmp/temp_text
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"D1"|"E1"
"A2"|"B2"|"2"|"D2"|"E2"
"A3"|"B3"|"3"|"D3"|"E3"

相关内容