如何用awk或sed为指定列(ID、geneID、gene_name)添加双引号
Hey there! Let's figure out how to add double quotes to the ID, geneID, and gene_name columns in your dataset. I'll share a few practical methods depending on the tool you prefer using—whether you're comfortable with command-line tools or Python.
Using Awk (Great for Command-Line Work)
If your data is in a CSV or TSV format, Awk is super flexible here, especially if you don't know the exact column positions upfront. This script will first identify which columns correspond to ID, geneID, and gene_name from the header, then add quotes to both the header labels and the data values in those columns:
awk -F ',' ' BEGIN {OFS=","} NR==1 { # Track column positions for target headers for(i=1;i<=NF;i++) { cols[$i] = i # Add quotes to target headers if($i ~ /^(ID|geneID|gene_name)$/) { printf "\"%s\"", $i } else { printf "%s", $i } printf (i<NF) ? OFS : "\n" } next } { # Process each data row for(i=1;i<=NF;i++) { if(i == cols["ID"] || i == cols["geneID"] || i == cols["gene_name"]) { printf "\"%s\"", $i } else { printf "%s", $i } printf (i<NF) ? OFS : "\n" } }' input.csv > output.csv
- Replace
,with\tif your file uses tab-separated values (TSV). - This works regardless of where your target columns are in the file.
Using Python Pandas (Perfect for Data Analysis Workflows)
If you're working in a Python environment and need more control over your data, Pandas makes this straightforward:
import pandas as pd # Load your data (adjust sep for TSV or other delimiters) df = pd.read_csv("input.csv") # Add quotes to the target column headers df.columns = [f'"{col}"' if col in ["ID", "geneID", "gene_name"] else col for col in df.columns] # Add quotes to every value in the target columns target_cols = ["ID", "geneID", "gene_name"] df[target_cols] = df[target_cols].apply(lambda col: col.apply(lambda val: f'"{val}"')) # Save the output without letting Pandas auto-add extra quotes df.to_csv("output.csv", index=False, quoting=3, sep=",")
- The
quoting=3parameter tells Pandas not to add any automatic quotes, so our manually added ones stay intact.
Using Sed (Quick Fix if Column Positions Are Fixed)
If you know the exact positions of your target columns (e.g., ID is column 1, geneID is column 3, gene_name is column 5), Sed can be a quick option:
# First, add quotes to the header labels sed '1s/\(ID\)/"\1"/; 1s/\(geneID\)/"\1"/; 1s/\(gene_name\)/"\1"/' input.csv | \ # Then add quotes to the data values in the fixed columns sed 's/^\([^,]*\)/"\1"/; s/\([^,]*\)/"\1"/3; s/\([^,]*\)/"\1"/5' > output.csv
- Adjust the column numbers (the numbers after the last
/in eachs/command) to match your actual column positions. - Again, swap
,for\tif using TSV.
Just pick the method that fits your workflow best, and let me know if you run into any kinks with your specific dataset!
内容的提问来源于stack exchange,提问作者Irving El Pelofino Lopez

