potong kolom 2 dari file teks

15

File teks saya tidak memiliki pembatas untuk menentukan spasi hanya pemisah, bagaimana cara saya memotong kolom 2 ke file output,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Jadi output yang saya butuhkan adalah

207
412
432
riley
sumber

Jawaban:

13

Ini paling mudah dengan awkyang memperlakukan beberapa ruang berturut-turut sebagai satu, jadi

awk '{print $2}' file

cetakan

207
412
431

Tetapi jelas ada banyak, banyak alat lain yang akan melakukan pekerjaan itu, bahkan tidak dirancang untuk tugas seperti grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file
jimmij
sumber
6

Gunakan pipa untuk mengirim data Anda (mis. Cat kolom.txt) ke dalam cut.

cat columns.txt | cut -d" " -f5

Dalam contoh data yang Anda berikan, pembatas ruang tunggal menempatkan data yang Anda inginkan di bidang 5. Untuk mengirim output ke file lain menggunakan pengalihan.

cat collumns.txt | cut -d" " -f5 > field2.txt

Menggunakan perintah awk Anda dapat melakukan sesuatu seperti di bawah ini yang secara otomatis mengenali bidang yang Anda cari karena ada data di sana (?) Saya perlu mempelajari lebih lanjut tentang awk.

awk -F' ' '{print $2}' columns.txt
aeiounix
sumber
3
Inkatasi cat ... |jarang diperlukan. Sebagian besar perintah Unix suka cutmengambil satu atau lebih file input sebagai argumen, mis cut -d" " -f5 columns.txt.
Denis Howe
1

seperti kata @jimmij, awk '{print $2}' fileadalah jawaban paling sederhana.

Jika, karena alasan tertentu, Anda tidak ingin menggunakan awkdan bersikeras untuk menggunakan cut, Anda dapat menggunakan seduntuk mengonversi setiap instance dari dua atau lebih spasi menjadi satu tab ( cutpembatas default) sebelum memotong menjadi cut:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
cas
sumber
0

Anda masih dapat menggunakan spasi tunggal sebagai pembatas, Anda hanya akan memiliki lebih banyak kolom. Tingkatkan nilai yang Anda berikan cut -d' ' -fdari 2 menjadi 5, atau mungkin 6. Tingkatkan angka tersebut hingga Anda mendapatkan hasil yang diinginkan.

Ryder
sumber
0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Di atas satu sangat berguna ketika utilitas Linux seperti awk untuk ekstraksi data tidak berfungsi jika Anda berubah menjadi pengguna "root" di dalam skrip shell seperti di bawah ini:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF
Alok Tiwari
sumber
1
Satu-satunya alasan " awktidak akan berfungsi" dalam contoh Anda adalah bahwa dokumen di sini tidak dikutip, yang berarti $2akan diperluas oleh shell ke parameter posisi kedua. Solusinya adalah mungkin untuk tidak beralih ke grepperintah tapi baik melarikan diri $di $2sebagai \$2atau untuk sekadar mengutip seluruh dokumen dengan menggunakan <<'EOF'di tempat <<EOF. Perhatikan juga bahwa tugas dalam contoh Anda lebih mudah dilakukan oleh pgrep.
Kusalananda
Terima kasih banyak @Kusalananda. Itu bekerja seperti pesona.
Alok Tiwari