วิธีลบสามคอลัมน์แรกในไฟล์ที่มีตัวคั่น

เช่น ผมมีไฟล์ csv ดังนี้

12345432|1346283301|5676438284971|13564357342151697 ...
87540258|1356433301|1125438284971|135643643462151697 ...
67323266|1356563471|1823543828471|13564386436651697 ...

และอีกหลายร้อยคอลัมน์ แต่ฉันต้องการลบสามคอลัมน์แรกและบันทึกลงในไฟล์ใหม่ (หากเป็นไปได้ ไฟล์เดียวกันจะดีกว่าสำหรับฉัน)

นี่คือผลลัพธ์ที่ฉันต้องการ

13564357342151697 ...
135643643462151697 ...
13564386436651697 ...

ฉันค้นหาและพยายามแต่ก็ไม่สามารถทำได้ และด้านล่างคือรหัสที่ฉันมี

awk -F'|' '{print $1 > "newfile"; sub(/^[^|]+\|/,"")}1' old.csv > new.csv

ขอขอบคุณถ้ามีคนสามารถช่วยฉันได้ ขอบคุณ


awk
person Heng Unn    schedule 07.03.2017    source แหล่งที่มา
comment
ตรวจสอบ stackoverflow.com/questions/ 2626274/   -  person Utsav    schedule 07.03.2017
comment
@Utsav ฉันลองแล้ว แต่ข้อมูลทั้งหมดของฉันก็เละเทะ เป็นเพราะตัวคั่นของฉันคือ | ?   -  person Heng Unn    schedule 07.03.2017


คำตอบ (4)


@เฮง: ลอง:

awk -F"|" '{for(i=4;i<=NF;i++){printf("%s%s",$i,i==NF?"":"|")};print ""}'  Input_file

หรือ

awk -F"|" '{for(i=4;i<=NF;i++){printf("%s%s",$i,i==NF?"\n":"|")};}'  Input_file

คุณสามารถเปลี่ยนเส้นทางเอาต์พุตของคำสั่งนี้ไปยังไฟล์ได้ตามความต้องการของคุณ

แก้ไข:

awk -F"|" 'FNR==1{++e;fi="REPORT_A1_"e;} {for(i=4;i<=NF;i++){printf("%s%s",$i,i==NF?"\n":"|") > fi}}'   Input_file1  Input_file2  Input_file3
person RavinderSingh13    schedule 07.03.2017
comment
ขอบคุณ @RavinderSingh13 ! งานตัดก็เช่นกัน คุณรู้ไหมว่าเป็นไปได้ไหมที่ฉันสามารถลบสามคอลัมน์แรกสำหรับ 10 ไฟล์พร้อมกันได้ ฉันต้องใช้ loop with cut หรือ awk หรือไม่? - person Heng Unn; 07.03.2017
comment
ใช่ ด้วย awk เราสามารถทำได้ แต่เราจำเป็นต้องทราบความต้องการของคุณและผลลัพธ์ที่คาดหวังเพื่อช่วยเหลือคุณมากขึ้น กรุณาโพสต์เดียวกันกับรายละเอียด - person RavinderSingh13; 07.03.2017
comment
ฉันต้องการบันทึกเอาต์พุตเป็นไฟล์ csv ถ้าฉันทำตามที่คุณแนะนำ Input_file1 Input_file2 Input_file3 ............Input_file10 หมายความว่าฉันต้องส่งออกแยกชื่อไฟล์ด้วยหรือไม่ เนื่องจากไฟล์ทั้ง 10 ไฟล์ของฉันมีชื่อคล้ายกันเช่น REPORT_A1_1, REPORT_A1_2, REPORT_A1_3, ........REPORT_A1_10 ดังนั้นฉันจึงสงสัยว่าฉันสามารถมีฟังก์ชันเรียกไฟล์ทั้ง 10 ไฟล์เหล่านี้ให้ทิ้งตามลำดับได้หรือไม่ - person Heng Unn; 07.03.2017
comment
ฉันแสดงความคิดเห็นที่นี่ @RaviderSingh13 - person Heng Unn; 07.03.2017
comment
โปรดตรวจสอบการแก้ไขคำตอบของฉัน คุณสามารถชอบได้หากคำถามของคุณได้รับการแก้ไขด้วย :) - person RavinderSingh13; 07.03.2017
comment
มันได้ผลเหมือนกันนะ คุณเก่งมาก ขอบคุณ อีกคำถามหนึ่ง หลังจากทิ้งสามคอลัมน์แรกไปแล้ว เป็นไปได้ไหมที่จะแทนที่เป็นชื่อไฟล์ต้นฉบับและทำเช่นเดียวกันกับ 10 ไฟล์ในคราวเดียวด้วย @RaviderSingh13 - person Heng Unn; 07.03.2017
comment
ฉันไม่เข้าใจ คุณต้องการนำเอาต์พุต Input_files ทั้ง 10 รายการไปไว้ใน Input_file เดียวกันหรือไม่ - person RavinderSingh13; 07.03.2017
comment
หากเป็นกรณีข้างต้น คุณสามารถใส่เอาต์พุตของคำสั่งไปที่ temp_input_file แล้วเปลี่ยนชื่อเป็น Input_file โปรดแจ้งให้เราทราบหากวิธีนี้ช่วยได้ - person RavinderSingh13; 07.03.2017
comment
ไม่ นี่ไม่ใช่สิ่งที่ฉันหมายถึง ผมขอยกตัวอย่าง เช่น REPORT_A1_1 ถูกลบออกจากสามคอลัมน์แรกใช่ไหม? และฉันต้องการให้ข้อมูลบันทึกกลับไปเป็นชื่อไฟล์เดียวกัน REPORT_A1_1 และผมอยากทำแบบนี้ให้ครบ 10 ไฟล์พร้อมๆ กันด้วย เป็นไปได้ไหม? ขออภัยสำหรับข้อมูลที่ไม่ชัดเจน และขอขอบคุณที่กรุณาอดทนรอเช่นกัน @RaviderSingh13 - person Heng Unn; 07.03.2017

คุณสามารถใช้ cut :

cut -f4- -d'|' old.csv  > new.csv
person Bertrand Martel    schedule 07.03.2017
comment
มีประสิทธิภาพมากกว่า awk - person codeforester; 07.03.2017
comment
ขอบคุณมาก. คุณรู้ไหมว่าเป็นไปได้ไหมที่ฉันสามารถตัดสามคอลัมน์แรกเป็น 10 ไฟล์พร้อมกันได้ ฉันจำเป็นต้องใช้ลูปหรือไม่? - person Heng Unn; 07.03.2017
comment
@HengUnn: โปรดโพสต์ตัวอย่างอินพุตและเอาต์พุตที่คาดหวังเพื่อให้ชัดเจนยิ่งขึ้น - person RavinderSingh13; 07.03.2017
comment
@ RavinderSingh13 ตัวอย่างอินพุตและเอาต์พุตเหมือนกับสิ่งที่ฉันโพสต์ด้านบน ฉันมีไฟล์ 10 ไฟล์ซึ่งฉันต้องวางสามคอลัมน์แรกทั้งหมดด้วย อยากรู้ว่ามีวิธีทำรวมกัน 10 ไฟล์ได้มั้ยคะ? ดังนั้นฉันจึงต้องวางสามคอลัมน์แรกสำหรับ 10 ไฟล์ในครั้งเดียวเท่านั้น - person Heng Unn; 07.03.2017
comment
@HengUnn: เพียงลองใช้คำสั่ง awk ด้านบนของฉันแล้ว Input_file1 Input_file2 Input_file3 ............Input_file10 และแจ้งให้เราทราบหากสิ่งนี้ช่วยคุณได้ - person RavinderSingh13; 07.03.2017

นี่คือสิ่งที่คุณกำลังมองหา:

awk -F '|' '{$1=$2=$3=""; print $0}' oldfile > newfile

แต่จะมีช่องว่างนำหน้า ดังนั้นให้เพิ่มการทดแทนต่อไปนี้:

sub(/^[ \t\|]+/,"") --> เปลี่ยนเป็น sub(/^[ \t\|]+/,"") (ยกเว้นนำหน้า '|' จากการลบคอลัมน์)

awk -F '|' '{$1=$2=$3="";OFS="|";sub(/^[ \t\|]+/,"") ;print $0}' oldFile > newFile

person SVTAnthony    schedule 07.03.2017
comment
ขอบคุณ @SVTAntony ฉันลองใช้รหัสของคุณแล้ว แต่ผลลัพธ์ของฉันเกิดข้อผิดพลาด คอลัมน์ทั้งหมดถูกรวมไว้ในคอลัมน์เดียว - person Heng Unn; 07.03.2017
comment
ใช้ awk -i inplace -F '|' '{$1=$2=$3=""; gsub(/\s+/,"|");}1' data.txt - person Bertrand Martel; 07.03.2017
comment
ฉันเพิ่งแก้ไขตัวอย่างเพื่อให้เหมาะกับความต้องการของคุณ สิ่งที่ฉันพลาดไปคือตัวแยกฟิลด์เอาท์พุต (OFS) ฉันยังได้ทำความสะอาดตัวแยกชั้นนำที่เกิดจากการเอาฟิลด์ออกด้วย ขอบคุณสำหรับการให้ฉันรู้ว่า. - person SVTAnthony; 07.03.2017
comment
ควรตั้งค่า OFS ก่อน การตั้งค่า $1=$2=$3="" -- ควรเป็น BEGIN หรือ commandline -vOFS='|' -- จากนั้นคุณต้องการเพียง sub(/^\|\|\|/,"") หรือง่ายกว่านั้น print substr($0,4) - person dave_thompson_085; 09.03.2017

person    schedule
comment
สวัสดี! โปรดอ่าน stackoverflow.com/help/how-to-answer และพยายามให้คำอธิบายว่าทำไมถึงเป็นเช่นนั้น รหัส. ขอบคุณ! - person Eel Lee; 09.03.2017
comment
แม้ว่าข้อมูลโค้ดนี้จะยินดีและอาจให้ความช่วยเหลือได้ แต่ จะดีขึ้นมากหากมีคำอธิบายของวิธีการ และ ทำไม สิ่งนี้ช่วยแก้ปัญหาได้ จำไว้ว่าคุณกำลังตอบคำถามของผู้อ่านในอนาคต ไม่ใช่แค่คนที่ถามตอนนี้! โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบาย และระบุว่ามีข้อจำกัดและสมมติฐานใดบ้าง - person Toby Speight; 10.03.2017