Chcę wymienić 28. kolumnę w pliku CSV od "2020-03-08" do "2020-03-08 00:00". Próbowałem: gawk -i inplace -F"," '{sub($28,"&00:00"); print}' $filename. To zapłonę, ponieważ 28 USD jest datą, która może być nawet pusta, więc zastępuje dowolną wartość w pliku nie określonej przez 28. kolumnie.

Ponadto 2020-03-08 może być obecny w dowolnym miejscu w pliku CSV, może zostać wymieniony zamiast 28. kolumny. Jak mogę to rozwiązać?

Np. Linii w pliku CSV:

1057481434,e0e529d7-0942-44b1-b26d-794809edb113,2020-03-08 00:20:54+00,2020-03-07 13:50:28+00,fc7557d9-900b-4739-a678-79273dbbcaaf,android,indoor,stationary,100,1774,1774,105,336305e8-abfc-41b6-a07e-50c297c517bc,indoor,f,,,t,,,2020-03-07 13:50:27.539555+00,2020-03-07 13:50:27.539555+00,,31.6838,76.5255,1600,0,2020-03-08,0,,,0,0,0,,"31.6838125,76.52552",America/New_York,ASUS_X00TD,asus,asus,0.8.0,com.pepkit.ssg,83,e172ebc7-a301-4ed0-98a8-d1b852cc2235
1
divyang shah 13 październik 2020, 14:22

1 odpowiedź

Najlepsza odpowiedź

Robisz ciąg w $28 i wymiana go w dowolnym miejscu na linii. Próbować

{ $28 = $28 " 00:00" }1

Lub, jeśli nalegasz na używanie sub,

{ sub(/$/, " 00:00", $28) }1

Zauważ, jak trzeci argument wskazuje gdzie zastąpić, zamiast na całej linii wejściowej.

Jeśli chcesz tylko wymienić, gdy $28 jest nie pusty, spraw, aby działało warunek.

$28 { $28 = $28 " 00:00" }1

Ostateczny 1 jest wspólnym skrótem

{ print }

Przypomnijmy, że zarówno warunki, jak i działanie są opcjonalne. Jeśli warunek jest pusty, akcja jest podejmowana bezwarunkowo. Jeśli akcja jest pusta, domyślnym działaniem jest wydrukowanie bieżącej linii wejściowej. Samotny 1 jest warunkiem, który zawsze jest prawdziwy.

1
tripleee 13 październik 2020, 11:35