两个问题:
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"