Temukan kolom duplikat dan pisahkan ke file atau variabel (Bash)


1

Saya memiliki output seperti; (Kolom dipisahkan oleh tab \t)

name1   something1
name1   something2
name1   something3
name2   something4
name2   something5

Untuk output ini saya butuh dua output (jika ada name3, saya akan membutuhkan 3 output) seperti

name1   something1
name1   something2
name1   something3

dan

name2   something4
name2   something5

Saya pikir ini akan dilakukan oleh AWK tetapi saya tidak bisa membuat kata-kata ajaib.

Apa cara terbaik untuk melakukan ini?

Saya memerlukan syarat untuk membaca $1"1. kolom" dan mencetak semuanya (tidak menghapus duplikat) kecuali itu akan berubah dan mencetak kolom lainnya ($ 2, $ 3, ...)

Saya pikir menggunakan loop itu mencetak output pertama dan seterusnya.

Jawaban:


2

Coba ini:

awk -F'\t' '{print>$1;}' file

Ketika perintah di atas selesai, akan ada dua file lagi di direktori:

$ cat name1
name1   something1
name1   something2
name1   something3
$ cat name2
name2   something4
name2   something5

Bagaimana itu bekerja

  • -F'\t'

    Ini memberitahu awk untuk menggunakan tab sebagai pemisah bidang.

  • print>$1

    Ini memberitahu awk untuk mencetak setiap baris ke file bernama setelah bidang pertama.

Menghapus karakter ilegal dari nama file

Misalkan file input terlihat seperti:

$ cat file
name/1  something1
name/1  something2
name/1  something3
name/2  something4
name/2  something5

Kode berikut membuat file berdasarkan bidang nama tetapi dengan /dihapus:

awk -F'\t' '{name=$1; gsub(/[/]/, "", name); print>name;}' file

Di atas diuji pada GNU awk dan berjalan dengan sukses. Jika pria Anda tidak menerima, cobalah:

awk -F'\t' '{name=$1; gsub("/", "", name); print>name;}' file

atau:

awk -F'\t' '{name=$1; gsub(/\//, "", name); print>name;}' file

1
lol itu elegan!
theoden

AWK tidak dapat membuka "name1" untuk keluaran? Itu tidak akan membuat file?
makgun

@ Bakgun Itu kemungkinan berarti bahwa perintah sedang dijalankan di direktori yang Anda tidak memiliki izin menulis . Sebelum menjalankan perintah, cdke direktori yang Anda miliki.
John1024

Saya berada di $ HOME di bash-shell
makgun

Penyebab masalah untuk meta charecters yang tidak diizinkan oleh sistem untuk dinamai file seperti: /
makgun

0

Saya pikir ini harus berhasil:

mkdir tmp; cd tmp
while IFS= read line; do
    echo "$line" >> $(echo "$line" | awk '{print $1}')
done
cat *

Ini membaca input baris demi baris dan menambahkan setiap baris sesuai dengan argumen pertamanya.

Jika Anda ingin mengalirkannya ke variabel:

while IFS= read line; do
    key="$(echo "$line" | awk '{print $1}')"
    eval "INPUT_$key='\$INPUT_$key\$line'"
done

Jika Anda memiliki tuntutan besar darinya, gunakan:

#!/usr/bin/python

import sys
import re

for line in sys.stdin:
    f = open(re.split("\s+", line, 1), 'a')
    f.write(line)
    f.close()

Ini akan bekerja Harus. Tidak mungkin gagal.


Dengan ini, hanya mencetak $ 1 dan tidak akan menemukan baris terakhir jika itu berubah
makgun

@akgun, itu akan, jika Anda menekan enter.
theoden

Saya membuat skrip bash dan menambahkan ini ke file dengan menambahkan < <(cat $file)setelah donetetapi tidak berhasil
makgun

@makgun, jika Anda berencana untuk menggunakan semua jenis karakter di semua platform, jangan gunakan bash/ awk/ gawk/ etc, gunakan perl/ python.
theoden

Saya tidak tahu bagaimana phyton bekerja dan saya perlu mengubah semua perintah sebelumnya untuk mendapatkan ini output pertama saya
makgun
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.